代码之家  ›  专栏  ›  技术社区  ›  AnnaSm

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

  •  0
  • AnnaSm  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   JNevill    7 年前

    问题是你正在限制 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 因为如果您的 分组依据 条款。我不确定MariaDB的新版本是否会抛出错误,但MySQL的新版本肯定会(低于5.7的版本会像现在这样运行):

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