2010-11-17 6 views
2

J'ai cette table, et je veux sélectionner toutes les valeurs user_id distinctes où il y a un événement = 'AAAAAAAAAA' et event = 'XXXXXXXXXX' (ie seul résultat devrait être user_id = 123456789)mysql select distinct où clause

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 

J'ai essayé à la fois:

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

qui me donne un jeu de résultats vide et

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

qui me donne tout. Toutes les suggestions - je devine que je dois descendre la route «rejoindre», n'est-ce pas?

Répondre

3

Essayez ceci:

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

Cela sélectionnera les deux listes (utilisateurs w/AAA, les utilisateurs w/XXX), puis les fusionner ensemble, en supprimant les doublons.

Espérons que ça aide!

Merci, Joe

+0

Beaucoup mieux que la requête SELECT ... WHERE EXISTS (...) 'que j'écrivais. ;) – cdhowie

+1

en fait, c'est faux car il fait "soit" et non "les deux". la révision maintenant :) –

+0

sélectionnez user_id distinct de ( select user_id de mesdonnées où l'événement = 'AAAAAAAAAAA' union select user_id de mesdonnées où l'événement = 'XXXXXXXXXXX'; ) –

2

que je le ferais avec une sous-requête:

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' 
); 
2

Les conditions de la clause WHERE ne sont applicables que sur une seule ligne à la fois. Afin de vérifier deux lignes, vous devez utiliser 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 

Si vous savez qu'un événement ne peut apparaître qu'une seule fois par utilisateur, vous pouvez utiliser GROUP BY:

SELECT user_id 
FROM mydata 
WHERE event in ('AAAAAAAAAA', 'XXXXXXXXXX') 
GROUP BY user_id 
HAVING count(user_id)=2 
0
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' 
    ) 
0

J'utiliserais quelque chose comme ça ...

SET @events := 'AAAAAAAAAA,XXXXXXXXXX'; 

SELECT user_id 
FROM mydata 
GROUP BY user_id 
HAVING GROUP_CONCAT(DISTINCT event ORDER BY event SEPARATOR ',') = @events;