Php 左加入筛选器最近30天加入的推荐人,而不是最近30天加入的推荐人

Php 左加入筛选器最近30天加入的推荐人,而不是最近30天加入的推荐人,php,mysql,sql,left-join,Php,Mysql,Sql,Left Join,我有两张桌子 表用户 USER_ID------USERNAME------------REGISTERTIME 1-----------------admin----------1432985224 2-----------------test ----------1433985224 3-----------------test2----------1332985224 表转介 REFERRER_ID----------REFERRAL_ID 1----------

我有两张桌子

表用户

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
选择
users.username,
将(转介.用户id)计数为转介
从…起
使用者
左连接
转介
referrals.referral\u id=users.user\u id
其中users.registertime>=UNIX\u时间戳('2015-10-15')和registertime
它显示的是

仅限最近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;
选择u.username,计数(*)作为推荐
来自你加入的用户
转介
在r.referral_id=u.user_id加入时
用户ur
在r.referer\u id=ur.user\u id和
ur.registertime>=UNIX_时间戳('2015-10-15')和
ur.registertime
我认为你不需要一个
左连接。您的示例都没有0个计数。如果您也需要它们,那么只需更改查询中的连接即可


您还应该养成习惯,在
分组方式中使用与在
选择中使用的列相同的列。这是一个很好的习惯,可以防止将来出现错误。

您需要输入有关推荐人的信息,并将其用于筛选

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;
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
选择u.username,计数(*)作为推荐
来自你加入的用户
转介
在r.referral_id=u.user_id加入时
用户ur
在r.referer\u id=ur.user\u id和
ur.registertime>=UNIX_时间戳('2015-10-15')和
ur.registertime
我认为你不需要一个
左连接。您的示例都没有0个计数。如果您也需要它们,那么只需更改查询中的连接即可

您还应该养成习惯,在
分组方式中使用与在
选择中使用的列相同的列。这是一个可以防止将来出错的好习惯。

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
users.username, 将(推荐人.推荐人\u id)计数为推荐人 从…起 使用者 左连接 转介 refererals.referer\u id=users.user\u id 其中users.registertime>=UNIX\u时间戳('2015-10-15')和registertime
选择
users.username,
将(推荐人.推荐人\u id)计数为推荐人
从…起
使用者
左连接
转介
refererals.referer\u id=users.user\u id
其中users.registertime>=UNIX\u时间戳('2015-10-15')和registertime
为什么选择users.username而选择group by users.user\u id?(无效的ANSI SQL…)要按引用日期筛选。该信息保存在哪个字段?在表格用户在列registertime@jarlh我有点迂腐(并不是说我真的容忍这种行为),但如果
user\u id
users
表的主键(似乎是一个合理的假设),然后按
用户分组。username
是有效的ANSI SQL,因为它在功能上依赖于
用户id
。i、 e.
user\u id
唯一地标识一行,因此在以
user\u id
@GarethD区分的组中选择哪个
username
是不可能有歧义的,您在这里绝对正确。但是我仍然相信旧规则“一个选定的列应该被列在分组中,或者是聚合函数的参数”是很好的,遵循它的程序员不会犯错误!为什么选择users.username而选择group by users.user\u id?(无效的ANSI SQL…)要按引用日期筛选。该信息保存在哪个字段?在表格用户在列registertime@jarlh我有点迂腐(并不是说我真的容忍这种行为),但如果
user\u id
users
表的主键(似乎是一个合理的假设),然后按
用户分组。username
是有效的ANSI SQL,因为它在功能上依赖于
用户id
。i、 e.
user\u id
唯一地标识一行,因此在以
user\u id
@GarethD区分的组中选择哪个
username
是不可能有歧义的,您在这里绝对正确。但是我仍然相信旧规则“一个选定的列应该被列在分组中,或者是聚合函数的参数”是很好的,遵循它的程序员不会犯错误!和他原来的queryAh没什么不同我看你已经意识到你的错误了。除非你编辑答案,否则我无法删除我的DV。我认为这会产生相同的结果,与他原来的问题没有什么不同。我知道你已经意识到了你的错误。除非你编辑答案,否则我无法删除我的DV。我认为这会产生相同的结果。你能用完整的单词键入“u”和“r”吗?我无法跟踪它:(@IngusGraholskis,即使您的首选是不使用表别名(不确定为什么会这样,没有人喜欢键入更多),在这里使用表别名很重要,因为
用户
表被引用了不止一次,所以您需要消除两个引用之间的歧义。@GarethD我知道!我不是很好,但我需要几个小时才能改正:好的,我做得比我想的快:D,这就是我想要的结果:)谢谢al