अब तक कुछ अच्छे उत्तर मिले हैं, लेकिन मैं आपके द्वारा मूल रूप से वर्णित के समान ही थोड़ा अलग तरीका अपनाऊंगा
SELECT
songsWithTags.*,
COALESCE(SUM(v.vote),0) AS votesUp,
COALESCE(SUM(1-v.vote),0) AS votesDown
FROM (
SELECT
s.*,
COLLATE(GROUP_CONCAT(st.id_tag),'') AS tags_ids
FROM Songs s
LEFT JOIN Songs_Tags st
ON st.id_song = s.id
GROUP BY s.id
) AS songsWithTags
LEFT JOIN Votes v
ON songsWithTags.id = v.id_song
GROUP BY songsWithTags.id DESC
इसमें टैग के साथ गाने को 1 पंक्ति प्रति गीत के आधार पर जोड़ने के लिए सबक्वायरी जिम्मेदार है। इसके बाद इसे बाद में वोटों में शामिल किया जाता है। जैसा कि आपने संकेत दिया है कि यह 1 या 0 है और इसलिए एक SUM(v.votes) जोड़ देगा 1+1+1+0+0 =5 में से 3 अपवोट हैं। जबकि SUM(1-v.vote) का योग होगा 0+0+0+1+1 =5 में से 2 डाउनवोट हैं।
यदि आपके पास कॉलम (id_song, वोट) के साथ वोटों पर एक इंडेक्स था तो उस इंडेक्स का उपयोग इसके लिए किया जाएगा ताकि यह टेबल पर भी हिट न हो। इसी तरह यदि आपके पास Songs_Tags पर (id_song, id_tag) के साथ एक अनुक्रमणिका थी तो वह तालिका क्वेरी से प्रभावित नहीं होगी।
संपादित करें गिनती का उपयोग करके जोड़ा गया समाधान
SELECT
songsWithTags.*,
COUNT(CASE WHEN v.vote=1 THEN 1 END) as votesUp,
COUNT(CASE WHEN v.vote=0 THEN 1 END) as votesDown
FROM (
SELECT
s.*,
COLLATE(GROUP_CONCAT(st.id_tag),'') AS tags_ids
FROM Songs s
LEFT JOIN Songs_Tags st
ON st.id_song = s.id
GROUP BY s.id
) AS songsWithTags
LEFT JOIN Votes v
ON songsWithTags.id = v.id_song
GROUP BY songsWithTags.id DESC