我的数据库有两个与此问题相关的表:
users: id, first_name, last_name, created_at
invitations: id, user_id
我要输出的是过去30天内创建的所有用户的列表,以及他们发出的邀请数量..查询的期望输出:
user.id | total_invitations
31 | 2
32 | 0
33 | 12
34 | 1
35 | 1
.....
这是我的工作进行中查询,我在这里做错了什么?
SELECT u.id,
u.first_name,
u.last_name,
u.invitation_approved_at,
COUNT(i.id) AS Total
FROM users u
LEFT JOIN invitations i
ON u.id = i.user_id
WHERE
i.type = 'email'
AND i.revoked_at IS NULL
AND u.invitation_approved_at >= curdate() - INTERVAL 30 DAY
AND u.invitation_approved_at < curdate() - INTERVAL -7 DAY
GROUP BY u.id
ORDER BY u.invitation_approved_at;
ty
答案 0 :(得分:1)
问题是您要限制WHERE子句中的LEFT JOIN'd
表,从而有效地将其转换为INNER JOIN。相反:
SELECT u.id,
u.first_name,
u.last_name,
u.invitation_approved_at,
COUNT(i.id) AS Total
FROM users u
LEFT JOIN invitations i
ON u.id = i.user_id
AND i.type = 'email'
AND i.revoked_at IS NULL
WHERE u.invitation_approved_at >= curdate() - INTERVAL 30 DAY
AND u.invitation_approved_at < curdate() - INTERVAL -7 DAY
GROUP BY u.id
ORDER BY u.invitation_approved_at;
将这两个条件移至ON
子句将导致在发生连接之前而不是AFTER之后对那些记录进行过滤。
我也建议在first_name
中包含last_name
和GROUP BY
字段,因为如果{{1} }子句。我不确定新版本的MariaDB是否会引发错误,但是新版本的MySQL肯定会(在5.7之前的版本可以按原样运行):
GROUP BY