2017-01-04 1 views
0

Это моя текущая таблица:MySQL: таблицы запросов с отчетливыми «действиями»

+--------+----------+------------+ 
| userid | action | day  | 
+--------+----------+------------+ 
| 123 | play  | 2016-11-06 | 
| 123 | purchase | 2016-11-06 | 
| 345 | login | 2016-11-06 | 
| 123 | level_up | 2016-11-07 | 
| 123 | play  | 2016-10-01 | 
| 456 | sign_out | 2016-10-02 | 
| 456 | sign_out | 2016-11-02 | 
+--------+----------+------------+ 

Я хочу, чтобы распечатать идентификатор пользователя, который имеет по крайней мере 2 уникальных действия. 456 имеет только 1 отдельный, поэтому я не хочу его распечатывать.

Так я хочу напечатать:

+--------+----------+------------+ 
| userid | action | day  | 
+--------+----------+------------+ 
| 123 | play  | 2016-11-06 | 
| 123 | purchase | 2016-11-06 | 
| 123 | level_up | 2016-11-07 | 
| 123 | play  | 2016-10-01 | 
+--------+----------+------------+ 

Это моя лучшая попытка:

SELECT userid as this_id 

FROM sampleTable WHERE (

SELECT COUNT(DISTINCT action) 
    FROM sampletable 
    WHERE userid = this_id) 
    >= 2; 

ответ

3

Вы должны рассчитывать отчетливое action для каждого пользователя первым. Затем с помощью inner join вы можете получить нужные строки.

SELECT 
* 
FROM your_table YT 
INNER JOIN 
(
    SELECT 
    userid 
    FROM your_table 
    --Add your where clause here 
    GROUP BY userid 
    HAVING COUNT(DISTINCT action) >= 2 
) AS t 
ON t.userid = YT.userid; 

EDIT:

В ответ на ваш комментарий

SELECT 
* 
FROM your_table YT 
INNER JOIN 
(
    SELECT 
    userid 
    FROM your_table 
    WHERE action IN ('play', 'level_up') 
    GROUP BY userid 
    HAVING COUNT(DISTINCT action) = 2 
) AS t 
ON t.userid = YT.userid; 
+0

Любой шанс у мог бы сделать его более простым :), потому что я также должен добавить туда, где только если идентификатор пользователя содержит как «play», так и «level_up». –

+0

Я могу добавить другую версию вышеуказанного запроса, используя 'EXISTS/IN', но это не упростит запрос. В чем проблема с добавлением предложения WHERE? – 1000111

+0

Вы знаете, как присоединиться к этому утверждению? –

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