MySQL计数事件发生的计数

时间:2018-05-17 15:18:04

标签: php mysql sql

我们的系统跟踪用户的评论,我们希望建立一个界面,让我们可以获得一个房间内的所有用户以及他们所做的评论数量。

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      ║

1 个答案:

答案 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