我们的系统跟踪用户的评论,我们希望建立一个界面,让我们可以获得一个房间内的所有用户以及他们所做的评论数量。
SELECT a.user_id, a.email,
COUNT(b.review_id) as num_reviews
FROM users a LEFT JOIN reviews b ON a.user_id = b.created_by
WHERE a.dataroom_id = 44 GROUP BY a.user_id ORDER BY num_reviews DESC
我希望做这样的事情:
SELECT a.user_id, a.email,
COUNT(b.review_id) as num_reviews,
**COUNT(b.date_completed IS NOT NULL) AS completed**
FROM users a LEFT JOIN reviews b ON a.user_id = b.created_by
WHERE a.dataroom_id = 44 GROUP BY a.user_id ORDER BY num_reviews DESC
我们计算该用户同时完成的号码。上面的陈述给出了每个人的零1,其余的人都有与他们总评论相同的数字。
期望的结果将是这样的表格:
╔═════════╦═══════════════════════════════════════╗
║ User_id ║ Email ║ # Reviews ║ # Completed ║
╠═════════╬═════════════╬═══════════╬═════════════╣
║ 1 ║ test0@e.com ║ 4 ║ 2 ║
║ 2 ║ test1@e.com ║ 1 ║ 0 ║
║ 3 ║ test2@e.com ║ 10 ║ 5 ║
║ 4 ║ test3@e.com ║ 5 ║ 3 ║
答案 0 :(得分:2)
你不想要count()
,你想要sum()
:
SELECT u.user_id, u.email,
COUNT(r.review_id) as num_reviews,
SUM(r.risk_score IS NOT NULL) AS completed
FROM users u LEFT JOIN
reviews r
ON u.user_id = r.created_by
WHERE u.dataroom_id = 44
GROUP BY u.user_id
ORDER BY num_reviews DESC;
我修复了表别名,因此它们是表名的缩写,而不是任意别名。
哦,哦。 。 。怎么了?count(<expression>)
只计算表达式不是NULL
的次数。 sum(<expression>)
将值加起来。 MySQL(与其他数据库不同)对待&#34; true&#34;为1和&#34;假&#34;因此,sum()
将布尔值为真的次数加起来。
或者,您可以使用count()
而不使用表达式:
SELECT u.user_id, u.email,
COUNT(r.review_id) as num_reviews,
COUNT(r.risk_score) AS completed