mysql group by join_mysql – GROUP BY之后的LEFT JOIN?
到目前為止已經有了一些很好的答案,但我會采用一種與你原先描述的方法非常相似的方法
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行.然后將其加入投票.我還選擇簡單地總結v.votes列,因為你已經指出它是1或0因此SUM(v.votes)將加起來1 1 1 0 0 = 3中有3是upvotes,而SUM(1 -v.vote)將總和0 0 0 1 1 = 5中的2個是downvotes.
如果你有一個帶有列(id_song,vote)的投票索引,那么該索引將用于此,所以它甚至不會擊中表.同樣,如果您在Songs_Tags上有一個索引(id_song,id_tag),那么該表將不會被查詢命中.
使用count編輯添加的解決方案
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
總結
以上是生活随笔為你收集整理的mysql group by join_mysql – GROUP BY之后的LEFT JOIN?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平板液晶电视的购买方法
- 下一篇: 陈醋泡蒜的功效与作用、禁忌和食用方法