2014-05-02 1 views
0

У меня есть следующий запрос. Я хотел бы настроить, чтобы выбрать только те user_ids, которые имеют несколько подписных_планов. В качестве примера, если user_id 4 имеет только один файл subscription_plan_id, он не должен появляться.Как выбрать только тех пользователей, у которых есть несколько записей, прикрепленных к ним?

Если user_id 5 имеет subscription_plan_id 2 и 3, он должен появиться. Любые советы о том, как это сделать?

select user_id, subscription_plan_id, created_at from 
subscriptions where 
(subscription_plan_id = 47 or 
subscription_plan_id = 78) 
and created_at between '2014-01-01' and '2014-01-31'; 

ответ

2

Посмотрите на эти ключевые слова SQL :

  • GROUP BY
  • HAVING
  • COUNT (DISTINCT [колонка])

Хорошо, хорошо, я сделаю это для тебя .... [ворчание] ....

SELECT 
    user_id, COUNT(DISTINCT subscription_plan_id), MIN(created_at), MAX(created_at) 
FROM 
    subscriptions 
WHERE 
    created_at BETWEEN '2014-01-01' AND '2014-01-31' 
GROUP BY 
    user_id 
HAVING 
    COUNT(DISTINCT subscription_plan_id) > 1 
; 
+0

"Grumble" :). Это работает, но возвращает user_id с первой подпиской. Как получить все подписные_планы для этого пользователя? – sharataka

+0

Я имел в виду, что это возвращает количество подписчиков. Тем не менее, я пытаюсь получить фактическое значение subscription_plan_ids. – sharataka

0

Вы должны использовать GROUP BY и HAVING, чтобы отфильтровать пользователей, которые имеют некоторое количество подписок, в вашем случае меньше 1. Попробуйте что-то вроде этого

select user_id, subscription_plan_id, created_at 
from subscriptions 
where (subscription_plan_id = 47 or 
    subscription_plan_id = 78) 
    and created_at between '2014-01-01' and '2014-01-31' 
    AND user_id IN (SELECT user_id FROM subscriptions ss 
        GROUP BY ss.user_id 
        HAVING COUNT(subscription_plan_id) > 1) ; 
Смежные вопросы