mysql выбрать отличное где предложение - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть эта таблица, и я хочу выбрать все различные значения user_id, где есть и событие = 'AAAAAAAAAA', и событие = 'XXXXXXXXXX' (т. Е. Единственным результатом должен быть user_id = 123456789)

unique_row_id  user_id          event       event_timestamp
----------------------------------------------------------------
0              123456789        AAAAAAAAAA  2010-01-20 15:00:00
1              123456789        abcdefghij  2010-01-20 15:00:05
2              123456789        XXXXXXXXXX  2010-01-20 15:00:15
3              987654321        AAAAAAAAAA  2010-01-20 16:00:00
4              987654321        abcdefghij  2010-01-20 16:00:05
5              987654321        abcdefghij  2010-01-20 16:00:15
6              111111111        XXXXXXXXXX  2010-01-20 16:01:00
7              111111111        XXXXXXXXXX  2010-01-20 16:01:05
8              111111111        XXXXXXXXXX  2010-01-20 16:01:15

Я пробовал оба:

SELECT distinct user_id from mydata where event='AAAAAAAAAA' and event='XXXXXXXXXX'

, который дает мне пустой набор результатов, и

SELECT distinct user_id from mydata where event='AAAAAAAAAA' or event='XXXXXXXXXX'

, который дает мне все. Любые предложения - я предполагаю, что мне нужно идти по пути "присоединиться", не так ли?

Ответы [ 5 ]

3 голосов
/ 17 ноября 2010

Попробуйте:

select user_id from mydata where event='AAAAAAAAAAA'
union
select user_id from mydata where event='XXXXXXXXXXX';

Это выберет оба списка (пользователи с AAA, пользователи с XXX), а затем объединит их вместе, удалив дублирующиеся строки.

Надеюсь, чтопомогает!

Спасибо, Джо

2 голосов
/ 17 ноября 2010

Условия предложения WHERE применимы только к одной строке за раз. Чтобы проверить две строки, вы должны использовать JOIN:

SELECT distinct a.user_id 
FROM mydata a, mydata b 
WHERE a.event='AAAAAAAAAA' AND b.event='XXXXXXXXXX' AND a.user_id = b.user_id

Если вы знаете, что событие может появляться только один раз для пользователя, вы можете использовать GROUP BY:

SELECT user_id
FROM mydata 
WHERE event in ('AAAAAAAAAA', 'XXXXXXXXXX')
GROUP BY user_id
HAVING count(user_id)=2
2 голосов
/ 17 ноября 2010

Я бы сделал это с помощью подзапроса:

select distinct user_id
from mydata m
where event = 'AAAAAAAAAA'
and exists (
  select 1
  from mydata
  where user_id = m.user_id
  and event = 'XXXXXXXXXX'
);
0 голосов
/ 17 ноября 2010

Я бы использовал что-то вроде этого ...

SET @events := 'AAAAAAAAAA,XXXXXXXXXX';

SELECT user_id 
FROM mydata
GROUP BY user_id
HAVING GROUP_CONCAT(DISTINCT event ORDER BY event SEPARATOR ',') = @events;
0 голосов
/ 17 ноября 2010
SELECT
    DISTINCT user_id
FROM
    my_table AS outer_table
WHERE
    EXISTS (
        SELECT
            1
        FROM
            my_table AS inner_table_A
        WHERE
            inner_table_A.user_id = outer_table.user_id AND
            inner_table_A.event = 'AAAAAAAAAA'
    ) AND
    EXISTS (
        SELECT
            1
        FROM
            my_table AS inner_table_B
        WHERE
            inner_table_B.user_id = outer_table.user_id AND
            inner_table_B.event = 'XXXXXXXXXX'
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...