SQL将计数与连接组合在一起

时间:2014-03-14 00:28:47

标签: sql join count

我有三张桌子:

Messages
messageid | userid | text 
Ex: 1 | 1303 | hey guys

Users
userid | username
Ex:
1303 | trantor
1301 | tranro1
1302 | trantor2

Favorites
messageid | userid
Ex:
1 | 1302
1 | 1301

我想要做的是显示一个包含用户名的表格,并计算他们的消息被收藏一定次数的次数。在上面的示例中,我想查询说"每个用户有多少消息已经被喜欢两次?" 它会显示一个有一行说

的表
trantor | 1

自然延伸是用"至少2","超过6"等替换两次。我试图将计数与连接组合并发现自己感到困惑。由于表格很大,我得到的数字却很有信心,但我的查询工作正常。我已阅读this article,但仍感到困惑:L

到目前为止我所拥有的:

SELECT USERS.username, COUNT(FAVORITES.id) FROM USERS INNER JOIN FAVORITES ON FAVORITES.userID=USERS.id WHERE COUNT(FAVORITES.id) > 2;

但我认为它不起作用。

在S.O.我在"相关子查询中找到了these questions"但我很困惑。

会是这样的吗?

SELECT  USERS.username,
 ,      (       SELECT  COUNT(FAVORTIES.userid)
                FROM    FAVORITES INNER JOIN ON MESSAGES
                WHERE   FAVORITES.messageid = MESSAGES.messageid
        )
FROM    USERS 

2 个答案:

答案 0 :(得分:0)

您应该了解SQL中的聚合函数。首先,如果您选择聚合函数,则需要执行GROUP BY。其次,涉及聚合函数的任何条件都应与HAVING子句而不是WHERE一起使用。

GROUP BY将应用于您选择的列以及任何聚合函数。

这是一个基本结构:

SELECT attribute1, COUNT(attribute2)
FROM someTable
GROUP BY attribute1
HAVING COUNT(attribute2) > 2;

应用您正在使用的任何其他内容,例如JOINSORDER BY以及其他内容。

注意:这些条款必须有一定的顺序。例如ORDER BY跟在HAVING之后,GROUP BY之后,等等。

如果我记得正确,操作顺序为:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

答案 1 :(得分:0)

当您使用COUNT()等汇总功能时,您需要将GROUP BYHAVING一起使用,而不是WHERE

SELECT USERS.username, COUNT(FAVORITES.id) 
FROM USERS 
INNER JOIN FAVORITES 
ON FAVORITES.userID=USERS.id 
GROUP BY USERS.username
HAVING COUNT(FAVORITES.id) > 2;

From documentation

  

如果在不包含GROUP BY子句的语句中使用组函数,则它等同于对所有行进行分组。