2009-10-15 4 views
12

J'ai besoin de fusionner deux résultats de requête comme en union, mais je veux seulement garder la différence entre les deux résultats. Est-ce possible?MySQL - Est-il possible d'obtenir «la différence» de deux résultats de la requête?

Je sélectionne essentiellement TOUTES les ressources dans la requête 1, et les ressources NOT-ALLOWED dans la requête 2, j'ai évidemment besoin des ressources ALLOWED dans mon dernier résultat.

Dans pseodo-code:

Query1 - Query2 

QueryResult 1:

+-------+ 
| id | 
+-------+ 
| 1 | 
+-------+ 
| 2 | 
+-------+ 
| 3 | 
+-------+ 
| 4 | 
+-------+ 
| 5 | 
+-------+ 
| 6 | 
+-------+ 

QueryResult 2:

+-------+ 
| id | 
+-------+ 
| 2 | 
+-------+ 
| 5 | 
+-------+ 

nécessaire:

+-------+ 
| id | 
+-------+ 
| 1 | 
+-------+ 
| 3 | 
+-------+ 
| 4 | 
+-------+ 
| 6 | 
+-------+ 
+0

L'exigence n'est pas claire. L'explication du texte mentionne TOUT de query1 mais l'exemple contredit cela. Essayons de définir l'exigence uniquement à travers l'exemple. Si query2 avait 7 ou 0, ces valeurs seraient-elles incluses dans la différence? – mjv

+1

Je suis d'accord que le titre ne s'aligne pas avec le corps de la question, mais la question elle-même est très claire. L'OP demande la soustraction: toutes les ressources qui ne sont pas "non disponibles": 'A - B' – nickf

+0

Pendant une minute, je pensais qu'il demandait de soustraire les valeurs de champ de la requête 1 pour interroger 2 valeurs de champs. – putolaruan

Répondre

40

Comme cela, en utilisant NOT IN:

SELECT id FROM queryOneTable 
WHERE id NOT IN (
    SELECT id FROM queryTwoTable 
) 
+1

si facile, mais si fonctionnant :) – Ropstah

4

Je testé cette requête dans SQLExpress, puisque je n'ai pas MySql. Je suppose que cela fonctionne de la même manière.

select x.id 
from x 
left join y on x.id = y.id 
where y.id is null 
+0

il devrait être 'select x.id' –

1

La jointure gauche approche est plus souple puisque vous pouvez l'utiliser sur deux tables (ou les deux ensembles de résultats de requête) où l'unicité ne consiste pas un identifiant mais d'un combo de plusieurs valeurs de colonnes. En outre, il est considéré comme meilleur SQL (ou au moins il l'était) pour maîtriser les jointures externes (à gauche), car il est plus performant que l'écriture des sélections imbriquées.