[SQL] [résolu] récuperer les lignes d'une table qui ne sont pas référencées dans une autre table en une seule requête

Bonjour,

J’ai un petit problème que j’ai résolu en PHP mais j’aurai aimé savoir s’il était possible de mieux utiliser SQL pour récuperer les infos dont j’ai besoin.

Alors voilà le problème:j’ai deux tables: images et vignettes

La première table (‹ images ›)contient des infos sur des images: id unique, id de la vignette de l’image stockée dans la deuxième table (‹ vignettes ›).

La deuxième table contient des infos sur les vignettes: id unique et nom du fichier.

Une même vignette peut être associée à plusieurs images mais une image ne peut être associée qu’à une seule vignette (ça c’est gêré ça tourne).

J’aimerais bien trouver une requête qui me renvoit les ids des vignettes qui ne se trouvent pas dans la colone ‹ id_vignette › de la table ‹ image ›. Autrement dit les vignettes orphelines.

Pour le moment je fais deux requêtes qui me renvoient chacune un tableau (l’un contenant toutes les ids de la table ‹ vignettes ›, l’autre contenant la colonne ‹ id_vignette › de la table ‹ tableaux ›). Je fais une comparaison de ces tableaux qui me renvoie un tableau contenant les id de la table ‹ vignettes › qui ne se trouvent pas dans la table ‹ tableaux ›.

J’efface ensuite toutes ces sales vignettes qui font rien qu’à prendre de l’espace pour rien.

Tout ça marche très bien en php avec le code qui suit:

[code]

$i = 0;
$result = mysql_query("SELECT id FROM vignettes");
while ($row = mysql_fetch_array($result)) {
 $i += 1;
 $vignette[$i] = $row['id'];
}
$i = 0;
$result = mysql_query("SELECT id_vignette FROM images");
while ($row = mysql_fetch_array($result)) {
 $i += 1;
 $image[$i] = $row['id_vignette'];
}
$purge = array_diff($vignette, $image);[/code]

Voilà… je récupère un tableau ‹ $purge › qui contient toutes les ids de la table ‹ vignettes › qui ne se trouvent pas dans la table ‹ tableaux ›.

Mais est-il possible de construire une requêt SQL qui me renverrait directement ce tableau (enfin les lignes de ce tableau?

Merci d’avoir lu ^^

Ps: c’est pas urgent ni même indispensable hein… ça tourne très bien mais s’il y a moyen de faire mieux niveau SQL je suis très curieux :stuck_out_tongue:

Oauip, tu fais une jointure entre les deux tables.
La requête arrive…

[edit] Mouais bon en fait pour la jointure je suis pas sûr que ce soit le plus simple. Si ta BD support le mot clé “EXCEPT” tu fais plus simplement:

un truc du style non ?

Aaaah! Merci beaucoup!

On ne m’a pas beaucoup appris en SQL et j’étais parti sur quelque chose comme ça:

[code]

SELECT vignettes.id
FROM images
LEFT OUTER JOIN vignettes
ON vignettes.id = images.id_vignette
WHERE vignettes.id != images.id_vignette[/code]

Malheureusement le ‹ != › n’existe pas en SQL et ‹ <> › n’a pas marché non plus. Je vais aller matter la doc et voir comment marche EXCEPT et NOT IN.

edit:
Voiilààà c’est le code d’azacreel mais j’ai corrigé l’erreur de table:

select id from vignettes where id not in (select id_vignette from images)

Merci :stuck_out_tongue: