如何确定最近30天内每个用户的邀请数?

时间:2018-08-03 16:29:03

标签: mysql mariadb

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

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

1 个答案:

答案 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_nameGROUP BY字段,因为如果{{1} }子句。我不确定新版本的MariaDB是否会引发错误,但是新版本的MySQL肯定会(在5.7之前的版本可以按原样运行):

GROUP BY