mysql - 复杂的 MySQL Select 查询

标签 mysql sql relational-database

这是我的表格布局:

Screenshot of database layout

我想做的事情:

  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

(请随意在示例中使用 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 |
+--------+-----------+--------+

最佳答案

我相信您的查询可能如下所示

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/

相关文章:

sql - TSQL - 基于表行和单元格值创建 View

sql - BigQuery 重复的rank()数字

mysql - 客户、供应商及其员工

mysql - 如果满足条件则省略 JOIN

mysql - 如何对每个字段具有特定条件的多个字段求和

mysql - 我是否必须在 node.js 中创建 MYSQL sequelize 中的每个表?

sql - PostgreSQL 和 C 多连接

mysql - 关系型数据库设计多用户类型

java - Gerrit 删除需要验证 +1(已验证)

mysql - 左连接不适用于条件