使用COUNT()从3个联接表中获取数据

米海洛·乔乔维奇(Mihailo Djordjevic)

我在MySql中有以下4个表:

用户名

  • 用户身份
  • 用户名
  • 密码
  • 其他一些东西

电影

  • movieID
  • 名称
  • 其他一些东西

收藏(用户与电影之间的多对多关系):

  • 用户身份
  • movieID

评论

  • reviewID
  • 用户身份
  • movieID
  • 其他一些东西

因此,基本上我想要从用户中提取数据,进行评论和收集并显示某种类型的用户统计信息,例如每个用户留下的评论数量以及每个用户保存到其收藏中的电影数量我以为这只是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 JOINs,从用户表开始:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用联接3个表的注释获取数据

如何使用联接从3级表中获取数据[Laravel]

使用NSFetchedResultsController获取3个表中的数据

使用INNER JOIN从3个相关表中获取数据

使用已知信息从Rails中的联接表获取数据

如何使用“联接”从两个表中检索数据?

如何使用联接从两个表中搜索数据

使用2个表中的数据,但无需联接?

从3个不同的表中获取数据

从3个关系表中获取数据

如何编写选择查询以使用PHP MySQL中的外键和联接从5个表中获取数据?

使用雄辩的laravel获取联接表数据

使用连接从两个表中获取数据并执行 Count 和 GroupBy

SQL联接3个表,然后在单个查询中从第4个表中提取数据

如何从联接三个表的Derby数据库中获取聚合和列数据

联接3个表和COUNT个结果

从3个联接表tsql中获取C#中列表中的值作为列表

使用实体框架联接3个表

使用Group By MySQL联接3个表

使用ecto查询联接3个表

如何使用Codeigniter中的两个联接表在表中显示数据

从3个表中显示,一个使用联接,另一个不使用联接

postgresql外部联接查询以从一个表中获取所有数据

在Laravel和Eloquent中获取2个以上联接表的数据

借助联接或另一种方式从两个表中获取数据?

MySQL查询从具有内部联接,别名的两个表中获取数据

左联接,不使用3个表的左联接

从 Oracle SQL 中的 3 个表中获取数据

如何在SQL中联接六个表并从六个表中获取数据?