SQL 通过加入 table 获取汇总细分
SQL get aggregate breakdown by joined table
我在 MySQL 数据库中有以下实体和关系:
- 每个
Post
有N个Review
- 每个
Review
有1个Comment
和一个状态(is_accepted
)
- 每个
Comment
有1个User
想要的结果:
我正在尝试获取针对特定 post 的评论的汇总报告,按用户分组:
+---------+--------------+-----------------------+---------------------+
| 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_count
和 review_denied_count
列是所有评论的总数,未按用户分组
试试这个:
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 子句中)。您无需进行子查询即可获得结果。这种方式更快。
如果您在 is_accepted 列中只有 1 和 0,您可以这样做:
SUM(`is_accepted`) AS review_accepted_count
我在 MySQL 数据库中有以下实体和关系:
- 每个
Post
有N个Review
- 每个
Review
有1个Comment
和一个状态(is_accepted
) - 每个
Comment
有1个User
想要的结果:
我正在尝试获取针对特定 post 的评论的汇总报告,按用户分组:
+---------+--------------+-----------------------+---------------------+
| 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_count
和 review_denied_count
列是所有评论的总数,未按用户分组
试试这个:
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 子句中)。您无需进行子查询即可获得结果。这种方式更快。
如果您在 is_accepted 列中只有 1 和 0,您可以这样做:
SUM(`is_accepted`) AS review_accepted_count