我有三张桌子:
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
答案 0 :(得分:0)
您应该了解SQL中的聚合函数。首先,如果您选择聚合函数,则需要执行GROUP BY
。其次,涉及聚合函数的任何条件都应与HAVING
子句而不是WHERE
一起使用。
GROUP BY
将应用于您选择的列以及任何聚合函数。
这是一个基本结构:
SELECT attribute1, COUNT(attribute2)
FROM someTable
GROUP BY attribute1
HAVING COUNT(attribute2) > 2;
应用您正在使用的任何其他内容,例如JOINS
和ORDER BY
以及其他内容。
注意:这些条款必须有一定的顺序。例如ORDER BY
跟在HAVING
之后,GROUP BY
之后,等等。
如果我记得正确,操作顺序为:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
答案 1 :(得分:0)
当您使用COUNT()
等汇总功能时,您需要将GROUP BY
与HAVING
一起使用,而不是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;
如果在不包含GROUP BY子句的语句中使用组函数,则它等同于对所有行进行分组。