2012-10-19 8 views
3

J'ai une table qui ressemble.mysql sélectionner correspondre plusieurs lignes

user project 
---- ------- 
bob  news 
bob  theatre 
sarah news 
fred news 
fred fred 
fred movies 
sarah movies 

Je suis en train de tirer une liste des projets si l'utilisateur est jamaisfred

donc le résultat sur la base du tableau ci-dessus serait.

bob theatre 

Je suis perplexe sur la façon d'y parvenir. J'ai une liste unique d'utilisateurs dans une autre table à laquelle je peux me joindre. Je peux le faire avec une boucle for dans un langage, mais je pense qu'il doit y avoir un moyen de le faire en SQL natif.

Répondre

0
select distinct a.* 
from mytable a 
left join mytable b on b.project = a.project and b.user = 'fred' 
where b.user is null 

Pour les lignes que vous voulez, il ne sera pas une ligne jointe et les lignes auront ces null valeurs, de sorte que la clause where filtre les seulement ceux.

+0

bien !! ça marche. J'accepterai cette réponse. Je pense que je comprends même pourquoi ça fonctionne. J'essayais quelque chose de similaire sans la partie nulle. – user1757914

0

La manière la plus simple d'y parvenir est probablement d'utiliser l'opérateur NOT EXISTS dans votre instruction WHERE; quelque chose comme:

Select P.* from Projects P Where NOT EXISTS (Select * from Projects P2 where P2.project = P.project and P2.user = 'fred') 

Une deuxième possibilité serait d'utiliser l'opérateur NOT IN:

Select P.* from Projects P Where P.project NOT IN (Select P2.project from Projects P2 where P2.user = 'fred') 

Ceci est pour Microsoft SQL-serveur; Cependant, ceci devrait fonctionner sans modification sur MySQL.

+0

Les performances ne sont pas bonnes avec 'exists()'. Ne l'utilisez que lorsque vous devez - les jointures sont généralement préférées. Bien, je vous accorde qu'ils sont plus faciles à comprendre – Bohemian

+0

Je suis d'accord avec vous que les performances ne sont pas toujours les meilleures lors de l'utilisation d'un EXISTS() mais je ne pense pas que cela puisse être préoccupant avec ce type de données. – SylvainL

Questions connexes