我们的系统跟踪用户的评论,我们希望创建一个界面,让我们可以获取房间中的所有用户以及他们所做的评论数量。
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
我们计算该用户同时完成的数量。上面的陈述给每个拥有 0 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 ║
最佳答案
你不想要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(与其他数据库不同)将“true”视为 1,将“false”视为 0。因此,sum()
将 bool 值为 true 的次数加起来。
或者,您也可以使用 count()
没有表达式:
SELECT u.user_id, u.email,
COUNT(r.review_id) as num_reviews,
COUNT(r.risk_score) AS completed
关于php - MySQL Count 发生某事的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395026/