如何关联MySQL两张表统计每个用户对应的周六事件记录数量
正确SQL查询写法
核心问题说明:
- 此前使用
INNER JOIN返回结果错误,是因为内连接会过滤掉没有关联事件的用户,必须用LEFT JOIN保留accounts表的全量用户 - 周六的过滤条件不能放在
WHERE子句中,否则会过滤掉左连接后无匹配事件的空行,导致没有周六事件的用户也被排除,建议将过滤条件放到JOIN的关联条件中,或者在聚合函数内做判断
写法1:过滤条件写在LEFT JOIN的ON子句中(推荐,性能更优)
SELECT a.name AS 用户名, COUNT(e.id) AS 周六次数 FROM accounts a LEFT JOIN events e ON a.id = e.account_id AND DAYOFWEEK(e.date) = 7 -- MySQL中DAYOFWEEK返回值1为周日,7为周六 GROUP BY a.id, a.name;
写法2:过滤条件写在聚合函数内
SELECT a.name AS 用户名, SUM(CASE WHEN DAYOFWEEK(e.date) = 7 THEN 1 ELSE 0 END) AS 周六次数 FROM accounts a LEFT JOIN events e ON a.id = e.account_id GROUP BY a.id, a.name;
结果验证
对应你给出的示例数据,两种写法返回结果一致:
| 用户名 | 周六次数 |
|---|---|
| Pete | 2 |
| Josh | 1 |
| Harry | 0 |
内容的提问来源于stack exchange,提问作者T. Hægh
相关产品推荐
相关产品推荐

