这是我的表格布局
![在此处输入图片说明] [1]
我想做什么:
votes
的{{1}}个数(作为参数传入)。我有什么:
songID
(请谨慎使用示例中的select a.SongID, count(*) as voteCount, b.UserID
from votes a left join votes b
on a.songID = b.songID
and b.RoomID = 178
and b.UserID = 71
where a.RoomID = 178
group by a.SongID, b.UserID
和RoomID
个数字)
上面的SQL语句执行1和2但不执行3.有没有办法将它扩展为3?在单个查询中完成所有这些操作会很高兴。现在它返回所有投票的歌曲,投票数以及所讨论的UserID
是否已投票(否则为空)。提前谢谢。
编辑:为了澄清一下,目前这个语句只输出带有UserID
表中条目的歌曲,我试图修改它以包含没有条目的歌曲votes
表(即包含votes
中的所有歌曲)。另外,请记住一切都是特定于房间的。歌曲按Select SongID from songs where RoomID = 178
匹配到某个房间。
这是我的歌曲表格,例如:
SongID
这是投票:
+--------+--------+
| SongID | RoomID |
+--------+--------+
| 2835 | 178 |
| 2836 | 178 |
| 2837 | 178 |
| 2838 | 178 |
| 2839 | 178 |
| 2840 | 178 |
| 2841 | 178 |
| 2842 | 178 |
| 2843 | 178 |
| 2844 | 178 |
| 2845 | 178 |
| 2846 | 178 |
| 2847 | 178 |
| 2848 | 178 |
+--------+--------+
最后,我到目前为止的查询结果:
只有前7首歌曲有投票,只返回。我想修改此查询以包括会议室中的所有歌曲,即使他们没有投票(并将投票计数返回为0或null)。
+--------+--------+--------+
| SongID | UserID | RoomID |
+--------+--------+--------+
| 2835 | 71 | 178 |
| 2836 | 71 | 178 |
| 2837 | 71 | 178 |
| 2838 | 71 | 178 |
| 2839 | 71 | 178 |
| 2840 | 71 | 178 |
| 2841 | 71 | 178 |
| 2842 | 71 | 178 |
+--------+--------+--------+
答案 0 :(得分:1)
我相信您的查询可能如下所示
SELECT s.SongID,
COALESCE(v.allVotes, 0) allVotes,
COALESCE(v.userVotes, 0) userVotes
FROM songs s LEFT JOIN
(
SELECT SongId,
COUNT(*) allVotes,
SUM(CASE WHEN UserID = 71 THEN 1 ELSE 0 END) userVotes
FROM votes
WHERE RoomID = 178
GROUP BY SongID
) v
ON s.songID = v.songID
WHERE s.RoomID = 178
这是 SQLFiddle 演示