这是我的表格布局:
我想做的事情:
- 数一下
votes
的数量对于每个songID
在特定房间(作为参数传递)。 - 查明用户 ID 是否对特定房间中的歌曲至少有一票。 UserID 也作为参数传入。
- 上述两者的延伸。如果某首歌没有投票,我想为这些条目返回 0。
我拥有的:
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
和 UserID
数字)
上面的 SQL 语句执行 1 和 2,但不执行 3。有没有办法将其扩展为执行 3?如果能在一个查询中完成所有这些工作那就太好了。现在它返回所有有投票的歌曲、票数以及是否 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 |
+--------+--------+
以下是投票结果:
+--------+--------+--------+
| 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 |
+--------+--------+--------+
最后,我到目前为止的查询结果:
只有前 7 首歌曲有投票,并且仅返回这些歌曲。我想修改此查询以包含房间中的所有歌曲,即使它们没有投票(并将投票计数返回为 0 或 null)。
+--------+-----------+--------+
| SongID | voteCount | UserID |
+--------+-----------+--------+
| 2835 | 1 | 71 |
| 2836 | 1 | 71 |
| 2837 | 1 | 71 |
| 2838 | 1 | 71 |
| 2839 | 1 | 71 |
| 2840 | 1 | 71 |
| 2841 | 1 | 71 |
+--------+-----------+--------+
最佳答案
我相信您的查询可能如下所示
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 演示
关于mysql - 复杂的 MySQL Select 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18457485/