[英]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_name
和last_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.