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
我有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