【问题标题】:SQL Combining Counts with JoinsSQL 将计数与连接结合起来
【发布时间】:2014-03-14 00:28:46
【问题描述】:

我有三张桌子:

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”等精确替换两次。我试图将 count 与 join 结合起来,发现自己很困惑。而且由于表很大,我得到计数​​但不确定我的查询是否正常工作。我已经阅读了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 

【问题讨论】:

    标签: sql join count


    【解决方案1】:

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

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

    这是一个基本结构:

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

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

    注意:这些子句必须有一定的顺序。例如ORDER BYHAVING之后,在GROUP BY之后等等。

    如果我没记错的话,操作顺序是:

    SELECT
    FROM
    WHERE
    GROUP BY
    HAVING
    ORDER BY
    

    【讨论】:

      【解决方案2】:

      当您使用 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 子句的语句中使用分组函数,则相当于对所有行进行分组。

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        相关资源
        最近更新 更多