我的数据库有两个与此问题相关的表:
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;
泰
1条答案
按热度按时间w51jfk4q1#
问题是你在限制
LEFT JOIN'd
where子句中的表有效地将其转换为内部联接。取而代之的是:把这两个条件转移到你的
ON
子句导致在联接发生之前而不是之后过滤这些记录。我也主张把你的
first_name
以及last_name
你的领域GROUP BY
如果您的数据库中不存在非聚合字段,其他rdbms都会出错GROUP BY
条款。我不确定更新版本的mariadb是否会抛出错误,但更新版本的mysql肯定会抛出错误(5.7之前的版本会很乐意按原样运行):