Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/08/2006, 17h28   #1
Candidat au titre de Membre du Club
 
Avatar de Pepito2030
 
Inscription : juillet 2006
Messages : 43
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 43
Points : 12
Points : 12
Par défaut [SQL] Probleme requete sql (jointure)

Bonjour,

Je rencontre un problème avec une requete sql... Je n'arrive pas à faire une jointure correcte.

But de la requete : afficher une liste d'artiste (à partir de la table interprete) tout en allant cherché une photo correspondante (dans la table interprete_photo)

Il s'agit d'une double requete. Cette double requete fonctionne correctement. Aussi, j'aimerais utiliser une jointure pour ne faire qu'une seule requete php :

Citation:
$req = mysql_query("SELECT idinterprete,vu FROM interprete ORDER BY vu DESC LIMIT $start,$limit");

while($row = mysql_fetch_array($req)){

$req2 = mysql_query("SELECT interprete_photo.id,interprete_photo.idinterprete,interprete_photo.nom FROM interprete_photo WHERE interprete_photo.idinterprete = '".$row['idinterprete']."' ORDER BY rand() LIMIT 1");
$photo = mysql_fetch_array($req2);

echo 'dgdfgdfgdgd';
}
Cette double requette affiche correctement la liste des artistes en les classant par 'vu' avec une photo correspondante à l'artiste affiché :
peter
franck
roger
robert
etc...

Là, il s'agit de ma requete jointure sql (afin de ne faire qu'une seule requete) qui inclus la liste des artistes/photos correspondant :
Citation:
$req = mysql_query("SELECT interprete.idinterprete,interprete.vu,interprete_photo.id,interprete_photo.idinterprete,interprete_photo.nom FROM interprete,interprete_photo WHERE interprete.idinterprete = interprete_photo.idinterprete ORDER BY vu DESC LIMIT $start,$limit");
Cette requete ne fonctionne pas correctement. Elle affiche autant de fois le nom de l'interprète que de photos lui appartenant :
peter
peter
peter
peter
franck
franck
roger
roger
roger
roger
roger
roger
roger
roger
robert
etc...

J'aimerais qu'elle affiche d'une part la liste des interprètes en fonction de 'vu' et qu'elle aille cherche dans la bdd interprete_photo, une photo (au hasard) pour chaque interprète affiché.

Je ne sais pas ou cela coince dans ma jointure . Quelqu'un pourrait me dire pourquoi svp ? Je dois m'y prendre mal

Merci !

PS : les variables $start et $limit servent pour les numéros de page.
Pepito2030 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 12h16   #2
Invité régulier
 
Inscription : août 2006
Messages : 5
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : août 2006
Messages : 5
Points : 5
Points : 5
Par défaut GROUP BY et LEFT JOIN

C'est bien ce qu'est sensée faire une jointure... Si tu fais une jointure normale (avec un where comme tu as fait) entre deux tables : si un interprète n'a aucune photo il n'apparait pas, s'il a 10 photos il apparait 10 fois.
Si tu ne veux qu'une ligne par interprete tu peux utiliser une fonction d'agrégation sur la photo par exemple :

Code :
1
2
SELECT i.* MAX(p.id) FROM interprete i,interprete_photo p WHERE i.idinterprete = p.idinterprete
GROUP BY i.*
Enfin, si tu veux que meme si l'interprete n'a pas de photo il apparaisse, tu dois utiliser une jointure gauche (ou droite...). Dans ce cas tu enleves le WHERE et tu mets :
Code :
1
2
 
.... FROM interprete i LEFT JOIN interprete_photo p ON i.idinterprete = p.idinterprete.
lecorne.sylvain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 18h12   #3
Candidat au titre de Membre du Club
 
Avatar de Pepito2030
 
Inscription : juillet 2006
Messages : 43
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 43
Points : 12
Points : 12
Salut

(dsl pour le retard de ma réponse j'ai tout mis de coté depuis un mois... j'avais bcp de travail et je n'ai pu retoucher au code )

Est ce que tu pourrais stp me décrire en détail ta première requete :

Code :
1
2
SELECT i.* MAX(p.id) FROM interprete i,interprete_photo p WHERE i.idinterprete = p.idinterprete
GROUP BY i.*
SELECT i.* => Selectionnes tous les champs de la table interprete ?
MAX(p.id) => ayant au moins un id dans la table interprete_photo ?

J'ai essayé de la mettre en place, mais cela ne me retourne aucun résultat.
Pepito2030 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 18h15   #4
Candidat au titre de Membre du Club
 
Avatar de Pepito2030
 
Inscription : juillet 2006
Messages : 43
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 43
Points : 12
Points : 12
A cette requete :

Citation:
$req = mysql_query("SELECT interprete.idinterprete,interprete.vu,interprete_photo.id,interprete_photo.idinterprete,interprete_photo.nom FROM interprete,interprete_photo WHERE interprete.idinterprete = interprete_photo.idinterprete ORDER BY vu DESC LIMIT $start,$limit");
Je viens d'ajouter un 'GROUP BY interprete_photo.idinterprete' avant 'ORDER BY vu) et cela fonctionne ^^

Est ce que cette requete est correcte ?

Citation:
$req = mysql_query("SELECT interprete.idinterprete,interprete.vu,interprete_photo.id,interprete_photo.idinterprete,interprete_photo.nom FROM interprete,interprete_photo WHERE interprete.idinterprete = interprete_photo.idinterprete GROUP BY interprete_photo.idinterprete ORDER BY vu DESC LIMIT $start,$limit");
Pepito2030 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h13.


 
 
 
 
Partenaires

Hébergement Web