像这样是否会更好一些(已调整为适合可计分查询格式 - 这是数据浏览器的测试):
-- [params]
-- date :start_date
-- date :end_date
SELECT
invited_by_id AS user_id,
COUNT(*) AS user_invites,
COUNT(*) * 10 AS invite_score
FROM invited_users iu
JOIN invites i ON i.id = iu.invite_id
JOIN users u ON u.id = iu.user_id
WHERE iu.redeemed_at::date BETWEEN :start_date AND :end_date
AND iu.user_id <> i.invited_by_id
AND u.created_at > iu.redeemed_at
GROUP BY invited_by_id
ORDER BY user_invites DESC
当用户被删除时,他们将从 invited_users 表中清除,因此不再计入计数。如果删除发生在 10 天内,则会自动更正,如果超过 10 天,则需要手动刷新分数。
使用 redeemed_at 日期将计入那些创建时间超过 10 天的邀请。
AND iu.user_id <> i.invited_by_id 也会排除自我邀请。
连接 users 表并添加 AND u.created_at > iu.redeemed_at 也会排除邀请现有用户。