我在MySql中有以下4个表:
用户名:
电影:
收藏(用户与电影之间的多对多关系):
评论:
因此,基本上我想要从用户中提取数据,进行评论和收集并显示某种类型的用户统计信息,例如每个用户留下的评论数量以及每个用户保存到其收藏中的电影数量。我以为这只是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
该用户似乎没有集合(您的第一个查询未返回它)。您可以改用LEFT JOIN
s,从用户表开始:
SELECT u.userID, u.username,
COUNT(DISTINCT c.movieID) AS collection_size,
COUNT(DISTINCT r.movieID) AS review_count
FROM usr u
LEFT JOIN collection c ON u.userID=c.userID
LEFT JOIN review r ON r.userID=u.userID
GROUP BY u.userID
尽管这可行,但效率不高。联接将两侧的行相乘,然后才对不同的主键值进行计数。我认为查询将更有效地用两个子查询来表述计数:
select u.userid, u.username,
(select count(*) from collection c where c.userid = u.userid) as collection_size,
(select count(*) from review r where r.userid = u.userid) as review_count
from usr u
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句