[MYSQL] requète mysql - selectionner un id inexistant ?

Bonjour :wink:

Sauriez vous vers quel mot clef m’orienté pour réaliser une requète qui me renverrai des enreistrement inexistants ?

Concrètement, j’ai une table avec des éléments indexés par un id, dansnune autre table j’ajoute des données sur ces mêmes enregistement grâce à leur id que je place dans un champs correspondant.

Comment réaliser une requète qui pourrait me renvoyer les id de la 1ère table qui ne sont pas référencées dans la 2nde ?

en gros il me faut un moyen d’intégré dans ma requète le fait que table1.id = table2.id_table1 n’ai pas de solution

where table1.id <> table2.id ?

EDIT : http://mysql.binarycompass.org/doc/mysql/f…-operators.html

Ca doit être qqch dans ce genre là :slight_smile:

plus simple mais pas mySQL :

sql: SELECT id FROM tableA MINUS SELECT id FROM tableB
pgsql: EXCEPT au lieu de MINUS

bon, c’est pas encore dans mySQL… Mais y a UNION.

Pour ta solution :
SELECT id FROM tableA WHERE id NOT IN(SELECT id FROM tableB)
UNION
SELECT id FROM tableB WHERE id NOT IN(SELECT id FROM tableA)

(mysql4.1 normalement)

c’est pas de la requète imbriquée ça ?

je testerai ça ce soir, à priori je dois pouvoir m’en tirer avec l’opérateur <=> mais si ta solution est valable sans-nom ça peut m’intéresser pour d’autres types de requètes

Les deux sont des requêtes imbriquées, mais la seconde marchera certainement sous mysql4.1

MySQL 4.0.24 :confused:

ouch alors.

Tu peux aussi passer par php : tu stocke tous les identifiants dans un tableau, et tu utilises array_diff.

avec un LEFT JOIN … IS NULL ?

SELECT * FROM table1 LEFT JOIN table2 USING(index_commun) WHERE index_commun IS NULL

'fin c’est ce que je fait pour vérifier les interventions qui n’ont pas de rapport de saisie (par exemple) :jap: …

j’ai pas testé mais vite fait comme ça, ta requète ne doit marcher que si mon index, ou au pire le nom de mon champ est le même… hors l’index de ma première table n’est pas un index dans la seconde table, et le champ ‘id’ existe dans la seconde table en tant qu’index aussi mais n’a rien à voir avec le champ ‘id’ de la 1ere table…

utilise ON au lieu de USING pour la jointure alors :jap: …
LEFT JOIN table2 ON table2.id2 = table1.id1 WHERE …

En fait, c’est tout con :o

Tu veux tout ce qui n’est pas dans la table 2 :

SQL
[color=blue;font-weight:bold]SELECT[/color] *

FROM table1 A
LEFT JOIN table2 B ON A.id = B.id
WHERE B.id IS NULL

Tout simplement :o

C’est ce qu’utilise phpmyadmin pour vérifier les clefs étrangères sous mySQL 4.1

(c’est exactement ce que j’ai marqué au dessus :o )

Y a pas le IS NULL. Donc non ! :slight_smile:

mais c’est pas grave :smiley:

ok ça marche, mon pb vient du fait que je n’ai jamais utilisé un JOIN de ma vie et que du coup je n’y pense pas, je ne sais même pas exactment son rôle dans la requète…

JOIN ? Ca produit une jointure.

Ca revient au même que le produit cartésien avec une condition sur les clefs communes :

SELECT * FROM a, b WHERE a.id = b.id

Sauf que JOIN est plus puissante. En particulier, tu peux choisir les tuples qui ne vérifient pas les conditions avec LEFT ou RIGHT JOIN (respectivement: à gauche y a quelque chose, ou à droite).

Maintenant plus dur ! je voudrai effacer tous ces enregistements, mais je ne trouve pas comment utiliser DELETE avec JOIN…

une idée ?

http://dev.mysql.com/doc/refman/4.1/en/delete.html genre

SQL
[color=blue;font-weight:bold]DELETE[/color] FROM table1 A

LEFT JOIN table2 B ON A.id = B.id
WHERE B.id IS NULL

ou

SQL
[color=blue;font-weight:bold]DELETE[/color] FROM table1 WHERE id NOT IN([color=blue;font-weight:bold]SELECT[/color] id FROM table2)

y’a pas à dire, utilisez pgsql :o

[:shy]