【发布时间】:2021-04-01 14:27:37
【问题描述】:
我在 MySql 中有这 4 个表:
用户:
- 用户ID
- 用户名
- 密码
- 其他一些东西
电影:
- 电影ID
- 姓名
- 其他一些东西
集合(用户和电影之间的多对多关系):
- 用户ID
- 电影ID
评论:
- 评论ID
- 用户ID
- 电影ID
- 其他一些东西
所以基本上我想要的是从用户、评论和收藏中提取数据并显示某种用户统计信息,例如 每个用户留下的评论数量,以及每个用户保存到他们收藏中的电影数量。我以为这只是 3 个表之间的简单连接,但显然我错了。
我认为使用 COUNT() 聚合函数是最好的主意,因此我开始对用户评论和用户收藏分别进行查询,结果很好,两个查询的结果都是正确的。
SELECT u.userID, username, COUNT(movieID) AS collection_size
FROM collection c INNER JOIN USER u ON u.userID=c.userID
GROUP BY c.userID
userID username collection_size
7 user 2
8 user03 6
和
SELECT u.userID, username, COUNT(movieID) AS review_count
FROM review r INNER JOIN USER u ON u.userID=r.userID
GROUP BY r.userID
userID username review_count
7 user 1
8 user03 4
10 user05 1
尝试连接所有三个表时会出现问题。我最接近解决问题的是:
SELECT u.userID, username, COUNT(DISTINCT c.movieID) AS collection_size, COUNT(DISTINCT r.movieID) AS review_count
FROM collection c INNER JOIN USER u ON u.userID=c.userID
INNER JOIN review r ON r.userID=u.userID
GROUP BY u.userID
userID username collection_size review_count
7 user 2 1
8 user03 6 4
结果几乎是正确的,但是您可以看到用户 ID 为 10 的用户丢失了,即使他留下了一条评论。这个查询似乎只选择了至少留下了一条评论并且在他们的收藏中至少有一部电影的用户。我已经通过将电影添加到用户 10 的收藏中来验证这一点。然后他正确地出现在结果中。 如何更改查询以显示已留下至少一条评论或在他们的收藏中至少有一部电影的用户?
基本上我希望结果是这样的:
userID username collection_size review_count
7 user 2 1
8 user03 6 4
10 user05 0 1
【问题讨论】:
标签: mysql sql count subquery left-join