Blix Posté 30 Août 2007 Posté 30 Août 2007 Salut à tous, j'essaye de comprendre le fonctionnement d'une requête que j'ai trouvé sur le net et je pense l'avoir enfin compris. J'ai donc détaillé son fonctionnement et je voudrais que quelqu'un me dise si ma compréhension est bonne ou pas. La requête me semble être de type JOIN implicite, elle prend en considération trois tables dans une base de données qui sert à cataloguer des photos et à les tagguer. Le schéma utilisé est (si j'ai bien compris !) en 3NF. La table photos contient les photos, la table tags contient les différents tags utilisables et la table photos_tags contient quel(s) tag(s) est attribué à quelle(s) photo(s). Voici la requête en question avec mes explications, ai-je bon ou pas ? Elle devrait rechercher les photos qui se sont vues attribuer le tag "animal" ET "plante" (ok, pas très logique !). Dans la pratique elle fonctionne, mais je veux aussi comprendre la théorie. SELECT p.* //Affiche toutes les colonnes de la table p FROM photos_tags pt, photos p, tags t //La requête porte sur les tables photos_tags (alias pt), photos (alias p), tags (alias t) WHERE pt.tag_id = t.tag_id //Condition n°1 : toutes les lignes de pt et t qui ont le champ tag_id en commun AND (t.name IN ('animal', 'plante')) //Condition n°2 : parmi les lignes séléctionnées jusqu'ici, celles dont le champ name (table t) est égale à "animal" ou "plante" AND p.photo_id = pt.photo_id //Condition n°3 : parmi les lignes séléctionnées jusqu'ici, celle dont le champ photo_id des tables p et pt concordent GROUP BY p.photo_id //Parmi les résultats, on regroupe les lignes qui ont un id identique en une seule ligne... HAVING COUNT( p.photo_id) = 2 //...à condition qu'il y en ait 2 Merci d'avance !
Petitmur Posté 5 Septembre 2007 Posté 5 Septembre 2007 T'as bien compris mais si tu compte utiliser cette requete il faudrait éviter de faire des jointures dans le WHERE et plutot utiliser des LEFT JOIN.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant