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

标签 php mysql sql left-join

我有两张 table

表用户

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

推荐表

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 天内加入并有推荐的用户)

新用户 1 有 12 个推荐 新用户 2 有 3 个推荐人 新用户 3 有 2 个推荐

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

老用户 1 有 52 个推荐 新用户 3 有 28 个推荐人 老用户 33 有 10 个推荐人

我希望我解释得很好

最佳答案

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

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。您的示例中没有一个计数为 0。如果您也需要它们,则只需更改查询中的连接即可。

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

关于php - LEFT JOIN 过滤最近 30 天加入的推荐人,而不是最近 30 天加入的推荐人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33300865/

相关文章:

mysql - SQL 重复键更新 - 在非主键上?

php - 从数据库中选择数据并在 MYSQL 中创建新列

php - 使用 Omnipay/Paypal 的 Laravel Omnipay - 找不到类

php - MySQL子串/数组性能

php - 在网页中使用可调整大小的字体的最佳方法是什么

mysql - 如何加速MySQL查询?从 3 个表加载数据

php - 重置MySQL表所有行中某个字段的内容

php - 获取当前登录的 TYPO3 用户 (fe-user)

php - PDO 未从超过 1 列的 SELECT 返回结果

php - 从 mysql schemata 的版本控制开始,不要矫枉过正。好的解决方案?