LEFT JOIN после GROUP BY?

У меня есть таблица «Песни», «Songs_Tags» (соотнесение песен с тегами) и «Songs_Votes» (соотнесение песен с логическим значением типа / нелюбовь).

Мне нужно получить песни с GROUP_CONCAT () его тегов, а также количество лайков (истина) и антипатий (ложь).

Мой запрос выглядит примерно так:

SELECT
    s.*,
    GROUP_CONCAT(st.id_tag) AS tags_ids,
    COUNT(CASE WHEN v.vote=1 THEN 1 ELSE NULL END) as votesUp,
    COUNT(CASE WHEN v.vote=0 THEN 1 ELSE NULL END) as votesDown,
FROM Songs s
    LEFT JOIN Songs_Tags st ON (s.id = st.id_song)
    LEFT JOIN Votes v ON (s.id=v.id_song)
GROUP BY s.id
ORDER BY id DESC

Проблема в том, что когда песня имеет более одного тега, она возвращается более одного раза, поэтому, когда я выполняю COUNT (), она возвращает больше результатов.

Лучшее решение, которое я мог придумать, - это можно было бы выполнить последнее LEFT JOIN после GROUP BY (так что теперь будет только одна запись для каждой песни). Тогда мне понадобится еще одна группа GROUP BY m.id.

Есть ли способ добиться этого? Мне нужно использовать подзапрос?

9
задан ekad 14 April 2017 в 02:11
поделиться