簡體   English   中英

如何確定最近30天內每個用戶的邀請數?

[英]How to determine the number of Invitations per user in the last 30 days?

我的數據庫有兩個與此問題相關的表:

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

問題是您在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之后過濾這些記錄。

我還主張在GROUP BY包括first_namelast_name字段,因為如果GROUP BY子句中不存在非聚合字段,則每個其他RDBMS都會出錯。 我不確定新版本的MariaDB是否會引發錯誤,但是新版本的MySQL肯定會(在5.7之前的版本可以按原樣運行):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM