Aller au contenu

requete sur trois tables


suede

Sujets conseillés

Bonjour

J'ai trois tables qui ont la structure suivante

`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.

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: ?

Merci d'avance

François

Lien vers le commentaire
Partager sur d’autres sites

Et si tu essaies de décomposer

photo.id_photo=photo_com.id_photo=lienphoto.id_photo

Ca donnerait :

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! ;)

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!)

Modifié par Bourinho
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

donc en gros

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 à

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

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...