2015-10-23 3 views
1

У меня есть 2 таблицыLEFT JOIN фильтры рефереры, которые присоединились последние 30 дней не рефералов, присоединившихся за последние 30 дней

ТАБЛИЦА ПОЛЬЗОВАТЕЛИ

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 дней и рефералов)

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

Я надеюсь, что я хорошо объяснил

+0

Почему именно пользователи users.username, но группа users.user_id? (Недействительно ANSI SQL ...) – jarlh

+0

Вы хотите отфильтровать по дате обращения. В каком поле сохраняется информация? – anna

+0

у ТАБЛИЦЫ ПОЛЬЗОВАТЕЛЕЙ В РЕГИСТРАТОРЕ СТОЛБЫ –

ответ

1

Вы должны ввести информацию о ссылающейся и использовать его для фильтрация

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. Это хорошая привычка, которая может предотвратить будущие ошибки.

+0

Можете ли вы наполнить слова «u» и «r» полными словами? я не могу его отслеживать :( –

+1

@IngusGraholskis Даже если вы предпочитаете не использовать псевдонимы таблиц (не знаете, почему это было бы, никто не любит набирать больше, чем они должны), важно использовать псевдонимы таблиц здесь, так как пользователи 'table ссылается не раз, поэтому вам нужно устранить двусмысленность между двумя ссылками. – GarethD

+0

@GarethD Я знаю!Я не очень-то хорош, но мне потребуется несколько часов, пока я не сделаю это правильно: D –

-1
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 
+0

Ничего отличного от его первоначального запроса – RiggsFolly

+0

А я вижу, вы поняли свою ошибку. Я не могу удалить свой DV, если вы не отредактируете ответ. – RiggsFolly

+0

Я думаю, что это дает тот же результат –

Смежные вопросы