0

这是我的表格布局:

数据库布局截图

我想做的事:

  1. 计算特定房间votes中每个房间的数量songID(作为参数传入)。
  2. 查明用户 ID 是否对特定房间中的一首歌拥有至少一票。UserID 也作为参数传入。
  3. 上述两者的延伸。如果一首歌没有投票,我想为这些条目返回 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 |
+--------+-----------+--------+
4

1 回答 1

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演示

于 2013-08-27T05:42:51.130 回答