2010-03-18 3 views
2

J'ai deux tables qui contiennent des informations transactionnelles. Il y aura beaucoup d'enregistrements par user_id dans chaque table. Table1 et Table2 ont une relation un-à-un les uns avec les autres. Je veux extraire des enregistrements des deux tables, mais je souhaite exclure les enregistrements qui ont certaines valeurs dans les deux tables. Peu m'importe si les deux n'ont pas ces valeurs, ou si une seule le fait, mais les deux tables ne devraient pas avoir les deux valeurs.Exclure les résultats où deux champs ne possèdent pas certaines valeurs

Par exemple:

SELECT t1.id, t1.type, t2.name 
    FROM table1 t1 
    INNER JOIN table2 t2 ON table.xid = table2.id 
    WHERE t1.user_id = 100 
    AND (t1.type != 'FOO' AND t2.name != 'BAR') 


Alors t1.type est de type ENUM avec environ 10 options différentes, et t2.name est de type également ENUM avec 2 options.

Mes résultats attendus chercheraient un peu comme:

1, FOO, YUM 
2, BOO, BAR 
3, BOO, YUM 

Mais au contraire, tout ce que je reçois est:

3, BOO, YUM 

Il semble filtrer tous les enregistrements qui a « FOO » comme le type, et «BAR» comme nom.

(Nous utilisons MySQL 5.1 ...)

+1

Votre requête me semble bonne - pouvez-vous inclure un vidage rapide des données de votre table. Peut-être y a-t-il quelque chose qui vous manque (par exemple, êtes-vous sûr qu'ils ont tous «t1.user_id = 100»?). –

+0

@Dominic Rodger: Je suis en désaccord respectueusement - voir ma réponse :) –

Répondre

6

Si je comprends bien votre question, vous devriez changer votre requête à utiliser OR:

AND (t1.type != 'FOO' OR t2.name != 'BAR') 

C'est le même que

AND NOT (t1.type = 'FOO' AND t2.name = 'BAR') 

et supprimera toutes les lignes, où les deux conditions correspondent.

+0

Wow, incroyable. C'était ça! Je ne peux pas comprendre pourquoi cela fonctionne, mais ça marche, lol. L'utilisation de AND NOT est logique, mais je n'arrive pas à comprendre pourquoi la fonction «OU» fonctionne. Les chiffres c'était quelque chose de simple cependant. Merci beaucoup!! – DondeEstaMiCulo

+0

La chose 'OR' ne trouve que des lignes, où ** au moins ** une valeur ne correspond pas, donc elle supprime les lignes où les deux correspondent :) –

+0

Ahhhh, j'ai gotcha. Ca a du sens maintenant ... Je pense que la chose qui m'a le plus déroutée était le "! =". C'est comme avoir un double négatif. Merci pour l'explication. :) – DondeEstaMiCulo

Questions connexes