LEFT JOIN 过滤最近 30 天加入的推荐人,而不是最近 30 天加入的推荐人

LEFT JOIN filters referrers that joined last 30 days not referrals that joined last 30 days

我有2张桌子

TABLE 用户

USER_ID------USERNAME------------REGISTERTIME  
1-----------------admin----------1432985224    
2-----------------test ----------1433985224
3-----------------test2----------1332985224     

TABLE 推荐

REFERRER_ID----------REFERRAL_ID 
1-----------------------------2
1-----------------------------3

如何用mysql显示:

user admin have 2 referrals in last 30 days
user test  have 0 referrals in last 30 days
user test2 have 0 referrals in last 30 days

尝试过:

SELECT
    users.username,
    COUNT(referrals.user_id) AS referrals
FROM
    users
LEFT JOIN
    referrals ON
    referrals.referral_id = users.user_id
WHERE users.registertime >= UNIX_TIMESTAMP( '2015-10-15' ) AND registertime < UNIX_TIMESTAMP( '2015-10-18' )
GROUP BY
    users.user_id

显示的是

仅限最近 30 天加入并有推荐的用户 但我需要它来显示过去 30 天内有新推荐的所有用户

错误:(这只显示最近 30 天内加入并有推荐的用户)

new user1 have 12 referrals new user2 have 3 referrals new user3 have 2 referrals

正确:(这显示了在过去 30 天内有推荐加入的所有用户)

Old user1 have 52 referrals New user3 have 28 referrals Old user33 have 10 referrals

希望我解释的很好

您需要引入有关 referrer 的信息并将其用于过滤

SELECT u.username, COUNT(*) AS referrals
FROM users u JOIN
     referrals r
     ON r.referral_id = u.user_id JOIN
     users ur
     ON r.referrer_id = ur.user_id AND
        ur.registertime >= UNIX_TIMESTAMP( '2015-10-15' ) AND
        ur.registertime < UNIX_TIMESTAMP( '2015-10-18' )
GROUP BY u.username;

我认为您不需要 LEFT JOIN。 None 个示例的计数为 0。如果您也需要它们,那么只需更改查询中的连接即可。

您还应该养成在 GROUP BY 中使用与 SELECT 中相同的列的习惯。这是一个好习惯,可以防止以后的错误。

SELECT
    users.username,
    COUNT(referrals.referrer_id) AS referrals
FROM
    users
LEFT JOIN
    referrals ON
    referrals.referrer_id = users.user_id
WHERE users.registertime >= UNIX_TIMESTAMP( '2015-10-15' ) AND registertime < UNIX_TIMESTAMP( '2015-10-18' )
GROUP BY
    users.user_id