【问题标题】:SQL get aggregate breakdown by joined tableSQL通过连接表获取聚合细分
【发布时间】:2021-07-01 03:38:54
【问题描述】:

我在 MySQL 数据库中有以下实体和关系:

  • 每个Post有N个Review
  • 每个Review 有1 个Comment 和一个状态(is_accepted)
  • 每个Comment 有1 个User

期望的结果:

我正在尝试获取特定帖子的评论汇总报告,按用户分组:

+---------+--------------+-----------------------+---------------------+
| user_id | review_count | review_accepted_count | review_denied_count |
+---------+--------------+-----------------------+---------------------+
| 1       | 3            | 2                     | 1                   |
| 2       | 5            | 1                     | 4                   |
| 3       | 1            | 1                     | 0                   |
+---------+--------------+-----------------------+---------------------+

我的尝试:

SELECT
    C.user_id,
    COUNT(C.user_id) AS review_count,
    (SELECT COUNT(*) FROM reviews WHERE `post_id` = R.post_id AND `user_id` = C.user_id AND `is_accepted` = 1) review_accepted_count,
    (SELECT COUNT(*) FROM reviews WHERE `post_id` = R.post_id AND `user_id` = C.user_id AND `is_accepted` = 0) review_denied_count
FROM reviews R
INNER JOIN comments C ON C.id = R.comment_id
WHERE post_id = 1234
GROUP BY C.user_id

实际结果:

返回的 review_accepted_countreview_denied_count 列是所有评论的总数,未按用户分组

【问题讨论】:

    标签: mysql sql join group-by subquery


    【解决方案1】:

    试试这个:

    SELECT
        C.user_id,
        COUNT(C.user_id) AS review_count,
        SUM(CASE WHEN `is_accepted` = 1 THEN 1 ELSE 0 END) AS review_accepted_count,
        SUM(CASE WHEN `is_accepted` = 0 THEN 1 ELSE 0 END) AS review_denied_count
    FROM reviews R
    INNER JOIN comments C ON C.id = R.comment_id
    WHERE post_id = 1234
    GROUP BY C.user_id
    

    在您的子查询review_accepted_count 和review_denied_count 中,您应该(在WHERE 子句中)通过review 主键加入。您无需进行子查询即可获得结果。这种方式更快。

    如果您在 is_accepted 列中只有 1 和 0,您可以这样做:

    SUM(`is_accepted`) AS review_accepted_count
    

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 2014-11-18
      • 2015-02-20
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多