如何确定过去30天内每个用户的邀请数量?

pw9qyyiw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(300)

我的数据库有两个与此问题相关的表:

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;

w51jfk4q

w51jfk4q1#

问题是你在限制 LEFT JOIN'd where子句中的表有效地将其转换为内部联接。取而代之的是:

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 子句导致在联接发生之前而不是之后过滤这些记录。
我也主张把你的 first_name 以及 last_name 你的领域 GROUP BY 如果您的数据库中不存在非聚合字段,其他rdbms都会出错 GROUP BY 条款。我不确定更新版本的mariadb是否会抛出错误,但更新版本的mysql肯定会抛出错误(5.7之前的版本会很乐意按原样运行):

GROUP BY u.id, u.first_name, u.last_name

相关问题