复杂的MySQL选择查询

时间:2013-08-27 05:17:36

标签: mysql sql relational-database

这是我的表格布局

![在此处输入图片说明] [1]

我想做什么:

  1. 计算特定房间中每个votes的{​​{1}}个数(作为参数传入)。
  2. 确定用户ID是否对特定房间中的某首歌有至少一票。 UserID也作为参数传入。
  3. 上述两项的延伸。如果一首歌没有投票,我想为这些参赛作品返回0。
  4. 我有什么:

    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 |
    +--------+--------+--------+
    

1 个答案:

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