Version complète: sur le forum Webmaster Hub : requete sur trois tables
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
suede
Bonjour
J'ai trois tables qui ont la structure suivante
CITATION
`photo`
`id_photo` smallint(5) unsigned NOT NULL auto_increment,
`nom_fichier` varchar(50) NOT NULL default '',
`id_pays` smallint(6) NOT NULL default '0',
`nom_auteur` varchar(50) NOT NULL default '',
`compteur` smallint(5) NOT NULL default '0',
`vote` smallint(5) NOT NULL default '0',
`date` date NOT NULL default '0000-00-00',
`ratio` decimal(4,2) NOT NULL default '1.00',


`photo_com`
`id_photo` smallint(5) unsigned NOT NULL default '0',
`langue` char(3) NOT NULL default '',
`alt` varchar(127) NOT NULL default 'photo de suede - photo of sweden',
`name` varchar(63) NOT NULL default 'sweden',
`titre` varchar(128) NOT NULL default '',
`sous_titre` varchar(128) NOT NULL default '',
`comment` text NOT NULL,
`recherche` enum('oui','non') NOT NULL default 'oui',
`traducteur` varchar(127) NOT NULL default 'François Lambert',
`urltraducteur` varchar(127) NOT NULL default 'http://www.photos-suede.com/',
`traducteuremail` varchar(127) NOT NULL default '',


`lienphoto`
`id_photo` smallint(5) unsigned NOT NULL default '0',
`id_theme` smallint(5) unsigned NOT NULL default '0',
`ordre_aff` tinyint(3) NOT NULL default '127',


La premiere table, photo, me stocke les infos sur la photo
La deuxieme table, photo_com, me stocke les commentaires dans les différentes langues
La troisieme table, lienphoto, me stocke la présence de la photo dans une ou plusieurs catégories thématiques.

Je souhaite récupérer
- Les enregistrements de la table photo (uniquement le champ nom_fichier)
- Les enregistrements de la table photo_com pour lesquels langue=une langue donnée (prenons comme example langue='fr')
+ pour toutes photos étant dans une certaines catégories par exemple, id_theme=41.

Pour l'instant, je fais cela en plusieurs requetes :
- select des id_photo dans lienphoto pour lesquels id_photo=41
Parcourt en boucle du résultat et récupération des données dans les autres tables. Donc, une requete en plus par photo...

En gros, ce que je veux faire.
CITATION
SELECT photo.nom_fichier, photo_com.id_photo .....etc.... photo_com.comment
FROM photo, photo_com, lienphoto
WHERE photo.id_photo=photo_com.id_photo=lienphoto.id_photo
AND photo_com.langue='fr'
AND lienphoto.id_theme=41


Bon, ca ne marche pas et ca m'étonne pas. Il faudrait sans doute joindre les tables quelque part... Si quelqu'un sait faire unsure.gif ?

Merci d'avance

François
Bourinho
Et si tu essaies de décomposer
CITATION
photo.id_photo=photo_com.id_photo=lienphoto.id_photo


Ca donnerait :
SQL
SELECT photo.nom_fichier, photo_com.id_photo .....etc.... photo_com.comment
FROM photo, photo_com, lienphoto
WHERE photo.id_photo=photo_com.id_photo AND photo.id_photo=lienphoto.id_photo AND photo_com.langue='fr' AND lienphoto.id_theme=41


C'est sans garantie, mais ça ne mange pas de pain! wink.gif

PS : Si tu pouvais citer le message d'erreur qui t'es donné, ça pourrait nous aider à... t'aider (c'est pas très heureux, mais je n'ai jamais dit que j'étais un poète!)
suede
ca marche, merci ;-)
Mais je pensais qu'il fallait passer par des cauchemars de Joint left machin chose ;-)

Ca sert à quoi les jointures ?


Merci
beal2912
Ce que tu fais sont déjà des jointures :

photo.id_photo=photo_com.id_photo

l'attribut JOIN LEFT (et autre) permet une optimisation (enfin c'est ce que j'ai compris) de ces jointures dans ta requête, et donc de gagner en performance.
suede
donc en gros

CODE
SELECT photo.nom_fichier, photo_com.id_photo, photo_com.alt, photo_com.titre, photo_com.sous_titre, photo_com.comment FROM photo, photo_com, lienphoto WHERE photo.id_photo = photo_com.id_photo AND photo.id_photo = lienphoto.id_photo AND photo_com.langue = 'de' AND lienphoto.id_theme = 104


est équivalent à

CODE
SELECT photo.nom_fichier, photo_com.id_photo, photo_com.alt, photo_com.titre, photo_com.sous_titre, photo_com.comment
FROM photo
LEFT JOIN lienphoto using (id_photo)
LEFT JOIN photo_com using (id_photo)
WHERE photo_com.langue = 'de' AND lienphoto.id_theme = 104


Par contre, je pensais que cette derniere requete me ressortirait des réponses même si il n'y a pas de d'enregistrement dans les tables photo_com et lienphoto à condition qu'il y en ait dans la table photo.

Mon probleme:
la table photo est la table des traductions -> les langues sv, fr et en sont completes. Mais la langue "de" est incomplete -> certaines id_photo n'ont pas de langue de.
Je voudrais pouvoir récupérer le champs photo.nom_fichier correspdonat à lienphoto.id_theme = 104 (il n'y a pas de langue dans la table photo) et avoir NULL pour les autres.

François
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.