Jointure multiple, sur la même table....

ViPHP
ViPHP | 3607 Messages

24 nov. 2008, 13:05

Bonjour à tous,
Je cherche à faire un truc que je n'arrive pas...
J'ai une table albums contenant entre autres deux id externes, respectivements id_scenariste et id_dessinateur, seulement ces deux ids pointent vers une même table, la tables auteurs avec comme id id_auteur
Alors je pensais faire une truc genre

Code : Tout sélectionner

SELECT al.id_scenariste, al.id_dessinateur, au.nom as scenar, au.nom as dessi FROM albums as al JOIN auteurs as au IN au.id_auteur=al._id_dessinateur and au.id_auteur=al.id_scenariste
seulement ça ne fonctionne pas....
Auriez-vous une idée pour ce genre de choses?
Merci d'avance!

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 nov. 2008, 14:48

Bonjour,

Code : Tout sélectionner

FROM albums as al
Sauf erreur de ma part, il me semble que le "AS" n'est pas nécessaire pour faire un alias de table mais uniquement pour faire des alias de champs.

Essaye donc avec ceci:

Code : Tout sélectionner

FROM albums al JOIN auteurs au
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

24 nov. 2008, 15:58

J'ignore si le AS est obligatoire ou non, mais je le mets toujours pous plus de clarté.

Voici une version de ta requête que devrait te permettre d'avancer.

La jointure doit être faite avec ON, le LEFT JOIN donne généralement de meilleurs résultats dans ce que j'ai besoin. Je ne crois pas qu'on puisse faire une jointure à double condition (ON ... AND ...) T'es mieux de filter avec WHERE ultérieument.

Vois pour toi:
SELECT al.id_scenariste, al.id_dessinateur, au.nom as scenar, au.nom as dessi 
FROM albums as al 
LEFT JOIN auteurs as au ON au.id_auteur=al._id_dessinateur 
WHERE au.id_auteur=al.id_scenariste
Soyez artisans de paix

ViPHP
ViPHP | 3607 Messages

24 nov. 2008, 16:23

Tout d'abord milles excuses si je me suis mal exprimé...
Bon déjà dans ma requête d'origine, j'ai bien ON et pas IN et tout ça, et ça fonctionne dans le sens où ça me retourne des résultats, mais c'est pas les bons ;)
En fait, ta requête Patriboom, va me donner la même valeur pour scenar et dessi, alors que les ids sont différents...
Le seul ennui, c'est que j'ai deux champs différents sui doivent joindre sur une même table...
des idées?

Mammouth du PHP | 881 Messages

24 nov. 2008, 16:47

Si tu n'as pas les résultats que tu veux avoir, c'est peut-être que tu ne cherches pas là où tu devrais chercher. Es-tu sûr de tes critères de recherche?

Peut-être vaudrait-il la peine de faire une sous-requête et de chercher à travers les résultats obtenus là, du genre de:
SELECT al.id_scenariste, al.id_dessinateur, au.nom as scenar, au.nom as dessi  
FROM albums as al  
WHERE au.id_auteur IN (
SELECT id_senariste FORM auteurs as au LEFT JOIN ... ON auteur=al._id_dessinateur  )
Soyez artisans de paix

ViPHP
ViPHP | 3607 Messages

24 nov. 2008, 17:02

Non non non, on part sur le mauvais pied... ;)
Je reprend, je selectionne bien l'enregistrement que je souhaite dans ma table albums, ça y a pas de soucis...
Le problème c'est d'arriver à faire une jointure, sur une même table pour deux champs différents...
Autrement dit, voici ce que donne un select "normal" sur la table album:

Code : Tout sélectionner

id_album id_serie titre_album id_scenariste id_dessinateur id_coloriste date_parution ISBN url_img 34 31 LES PRETRESSES D'ISIS 51 52 0 2008-11-26 978-2302002944 http://www.bedeo.fr/var/bedeo/storage/images/data/...
Bon dsl pour la présentation, c'est pas très lisible, mais on voit bien que les deux id_dessinateur et id_scenariste ont une valeur différente...
Ce qui correspond à des noms différents dans ma table auteurs, c'est un peu plus clair?

Eléphant du PHP | 254 Messages

24 nov. 2008, 17:37

Et si tu faisait deux jointure sur ta table auteur ? avec deux alias différents, puisque tu récupere deux enregistrements différent

ViPHP
ViPHP | 3607 Messages

24 nov. 2008, 18:06

All right!!!
cette requête fonctionne:

Code : Tout sélectionner

SELECT al.titre_album, al.id_scenariste, al.id_dessinateur, au1.nom AS dessi, au2.nom AS scenar FROM albums AS al LEFT JOIN auteurs AS au1 ON au1.id_auteur = al.id_dessinateur LEFT JOIN auteurs AS au2 ON au2.id_auteur = al.id_scenariste
Mais quid des performances?
En tout cas ça fonctionne ;)
J'attend vos retours éventuels niveau performance ;)