2013-05-22 4 views
1

Ok j'ai essayé de regarder partout stackoverflow, et la solution la plus proche, j'ai trouvé est la suivante: mysql AND clause on same column multiple timesMYSQL comparer les valeurs de mêmes colonnes

Mais je ne peux pas utiliser des déclarations et « ayant » la syntaxe ne fonctionnera pas parce que de groupe par. Il doit y avoir une solution simple à cela.

Les 2 tables ressemble à ceci (simplifié):

utilisateurs:

uid name 
1 person 1 
2 person 2 
3 person 3 

catégories:

uid value 
1 actor 
1 musician 
2 actor 
3 dancer 
4 musician 
4 dancer 

Je veux obtenir le uid de ceux qui sont 2 valeurs au en même temps. Par exemple, je veux obtenir l'UID qui est un acteur et un musicien. Pas seulement une valeur, mais les deux doivent être requis!

D'abord, j'essayé ceci:

SELECT users.uid, users.name 
FROM 
users 
LEFT OUTER JOIN categories ON users.uid = categories.uid 
WHERE (categories.value = 'actor' AND categories.value = 'musician') 
GROUP BY u.uid; 

Bien sûr, ne fonctionne pas depuis une ligne ne peut pas avoir 2 valeurs.

Est-ce que quelqu'un connaît une solution?

Répondre

4

Vous pouvez vous joindre aux pour obtenir le résultat plusieurs fois de table categories:

SELECT users.uid, users.name 
FROM users 
INNER JOIN categories c1 
    ON users.uid = c1.uid 
INNER JOIN categories c2 
    ON users.uid = c2.uid 
WHERE c1.value = 'actor' 
    AND c2.value = 'musician'; 

Voir SQL Fiddle with Demo

+0

Celui-ci fait fonctionner pour moi. Mon db est plus compliqué que ça, mais j'ai simplifié le problème, et je dois le "traduire" à l'API DB de Drupal, c'est peut-être pourquoi ça n'a pas marché, ou peut-être parce que j'ai rejoint 5 autres tables ... Je ne sais pas, ma première pensée était que "group by" ne donne que 1 rang, donc count serait toujours 1, mais je ne sais pas ... –

3

Utilisez une having clause

SELECT u.uid, u.name 
FROM users u 
LEFT OUTER JOIN categories c ON u.uid = c.uid 
WHERE c.value = 'actor' OR c.value = 'musician' 
GROUP BY u.uid 
having count(distinct c.value) > 1 
4
SELECT users.uid, users.name 
FROM users 
    LEFT JOIN categories ON users.uid = categories.uid 
WHERE categories.value in ('actor', 'musician') 
GROUP BY u.uid, users.name 
having count(distinct categories.value) = 2; 
0

Si vous faites vraiment pas voulez utiliser having vous pouvez essayer ceci:

SELECT uid, name 
FROM users 
WHERE 
uid IN (SELECT uid FROM categories WHERE value='actor') 
AND uid IN (SELECT uid FROM categories WHERE value='musician') 

Mais il n'y a vraiment rien de mal à utiliser HAVING;)

Questions connexes