2016-06-21 5 views
4

У меня есть таблица со следующими типами и информацией.Получить всех отличных пользователей - MySql

product_id | user_id | product | date_opened 
1   | 10 | shoes | 2016-04-01 
2   | 26 | shoes | 2016-04-01 
3   | 10 | watch | 2016-04-01 
4   | 23 | shoes | 2016-04-01 
5   | 10 | shoes | 2016-01-01 
6   | 13 | watch | 2016-01-01 
7   | 14 | shoes | 2015-11-02 
8   | 10 | slippers| 2015-11-02 
9   | 10 | shoes | 2015-11-02 
10   | 15 | watch | 2015-11-02 
11   | 19 | watch | 2015-09-03 
12   | 19 | watch | 2015-03-02 
13   | 19 | shoes | 2015-01-03 

Пользователи могут покупать товары, если они открыты. date_open - это циклы даты. пользователи могут купить как можно больше товаров, например user_id , пользователь имеют 2 изделия по циклу 2016-04-01. Один продукт - 2016-01-01, два - 2015-11-02.

Теперь я хотел бы получить все (отличный) user_id , которые являются активными/есть продукты на все предыдущий 3 цикл дата (2016-04-01, 2016-01-01 и 2015- 11-02).

Обратите внимание, что пользователь может иметь много продуктов в цикле.

Дополнительно: Активный - должны последовательно иметь продукты в 3 набор dates и без пропуска. Таким образом, он должен показать всех пользователей с продуктами на дату 2016-04-01 и 2016-01-01 и 2015-11-02. Не пользователь с продуктами только в 1 или 2 датах.

Другая проблема: Пример: У меня есть пользователи с разными датами (2000-04-05, 2001-09-03, 2006-09-01, 2015-11-02 и т. Д.). Я просто хочу получить здесь все те пользователи с датами ('2016-04-01', '2016-01-01', '2015-11-02').

+0

Используйте 'GROUP BY' при чтении [эта тема] (http://stackoverflow.com/questions/164319/is- there-any-difference-between-group-by-and-distinct) и [группа по странице руководства] (https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html) – Martin

ответ

3

Этот SQL получает вас различные пользователи, которые имеют продукты на всех предыдущих дат три цикла:

SELECT USER_ID 
FROM YOUR_TABLE OUTER_TABLE 
WHERE 3 = (SELECT COUNT(DISTINCT DATE_OPENED) 
      FROM YOUR_TABLE INNER_TABLE 
      WHERE DATE_OPENED IN ('2016-04-01', '2016-01-01', '2015-11-02') 
      AND OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID); 

Заявление может быть быстрее (непроверенные), если переписать следующим образом:

SELECT DISTINCT USER_ID 
FROM YOUR_TABLE OUTER_TABLE 
WHERE EXISTS (SELECT 1 
       FROM YOUR_TABLE INNER_TABLE 
       WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID 
       WHERE DATE_OPENED = '2016-04-01') 
AND EXISTS (SELECT 1 
       FROM YOUR_TABLE INNER_TABLE 
       WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID 
       WHERE DATE_OPENED = '2016-01-01') 
AND EXISTS (SELECT 1 
       FROM YOUR_TABLE INNER_TABLE 
       WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID 
       WHERE DATE_OPENED = '2015-11-02'); 
+0

Ваши даты здесь не динамические –

+0

Насколько я понял, им не нужно быть динамичным. Требование состоит в том, чтобы получить список активных пользователей, то есть пользователей, которые имеют продукты в течение трех предыдущих дат цикла. Конечно, SQL отличается, если требование состоит в том, чтобы получить список пользователей, у которых есть продукты по меньшей мере в три разные даты цикла в прошлом. –

+0

Что происходит, когда дата тикает до '2017'? –

1
select distinct (user_id) from prod inner join 
(select distinct(date_opened) from prod order by date_opened desc limit 3) t 
on prod.date_opened = t.date_opened 

Внутренний выбор получает последние 3 цикла. Внешний выбор находит все записи для этого цикла и получает отчетливый user_id-s из них

SqlFiddle

+0

Мне нравится идея здесь. Проблема в том, что некоторые из моих пользователей имеют даты, которые не указаны в моем вопросе '('2016-04-01', '2016-01-01', '2015-11-02')'. Например, у меня есть пользователи с разными датами '(2000-04-05, 2001-09-03, 2006-09-01, 2015-11-02 и т. Д.).' Поэтому он будет включен в ваш запрос. Я просто хочу получить все эти пользователи с датами '('2016-04-01', '2016-01-01', '2015-11-02')'. Надеюсь услышать вас снова. Благодаря! –

+0

Пользователи, у которых есть даты в более старых циклах, а также в последних 3 циклах, будут включены, пользователи, которые имеют даты ТОЛЬКО в более старых циклах, не будут, [sqlfiddle] (http://sqlfiddle.com/#!9/eb990/1) , Если вы хотите получить пользователей, которые ТОЛЬКО имеют даты в последние 3 цикла и ни в какие другие циклы, пожалуйста, сообщите об этом, и я немного исправлю свой запрос. –

+0

Я только что обновил свой пост. И добавлен некоторый образец на столе. –

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