2011-12-18 6 views
0

У меня есть таблица, которая выглядит так: http://d.pr/jQ1P, а затем другая таблица (назовем ее таблицей «действия»), которая содержит список вещей, которые все пользователи сделали.Как написать запрос для следующего сценария?

Как написать запрос, который может подсказать, сколько новых пользователей referrer_id «1» ссылается, что также содержит как минимум 1 запись в таблице «действия»? Например. Для referrer_id «1», «1723» и «1724» оба имеют по крайней мере 1 строку в таблице «действия», но не «1725. Так что для пользователя« 1 »он успешно отсылает 2 пользователей, хотя есть также" 1725" .

Надежда, что имеет смысл.

+2

Было бы легче понять ваш вопрос, если вы добавили схему прямо в него. Вы можете получить определение таблицы, выполнив 'объяснять действия' или' show create table actions'. И сделайте то же самое для другой таблицы. –

+0

Вот «действия» - http://d.pr/BHne, а вот «реферал» - http://d.pr/V2Ei. –

+0

Не работает ли решение @ Corbin для вас? –

ответ

2

Здесь вы идете:

SELECT 
    COUNT(DISTINCT r.new_user_id) 
FROM 
    referral r  
    JOIN actions a ON a.fk_userid = r.new_user_id 
WHERE 
    r.referrer_id = 1; 
2

Использование JOIN, вы знаете, что если есть строка, то по крайней мере 1 строка сопоставляется в таблице JOIN. вы можете комбинировать, что с GROUP BY, чтобы вытащить . уникальные идентификаторы у меня есть чувство, что это может быть гораздо более эффективным способом, но первое, что приходит на ум:

SELECT 
    COUNT(referrals.new_user_id) 
FROM 
    referrals 
    JOIN actions ON actions.user_id = referrals.new_user_id 
WHERE 
    referrals.referrer_id = 1 
GROUP BY referrals.new_user_id; 

Edit: Подумав немного, предполагая все индексируется, я не может думать о более эффективном решении. Некоторая мягкая поисковая система подсказывает, что COUNT (DISTINCT referrals.new_user_id) может быть быстрее вместо использования GROUP BY.

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