【问题标题】:Complicated MySQL Select query复杂的 MySQL 选择查询
【发布时间】:2013-08-29 17:33:01
【问题描述】:

这是我的表格布局:

我想做的事:

  1. 计算特定房间中每个songIDvotes 数量(作为参数传入)。
  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

(在示例中随意使用RoomIDUserID 数字)

上面的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 |
+--------+-----------+--------+

【问题讨论】:

  • 你能把你想要的输出吗
  • songs 中的RoomIDvotes 中的RoomID 有什么关系?
  • songs 中的RoomIDvotes 中的RoomID 都是rooms 中原始RoomID 的外键
  • 我明白这一点。问题是,如果一首歌曲可以在多个房间中播放,为什么你的歌曲中有 RoomID?能否提供样本数据?

标签: mysql sql relational-database


【解决方案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演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2015-11-04
    • 2018-02-19
    相关资源
    最近更新 更多