Jointure multiple

Mammouth du PHP | 19672 Messages

17 janv. 2012, 18:15

$disquesId = $database->query('SELECT id_disque FROM disques LIMIT 0, 10');

$answer = $database->query("SELECT * FROM pistes
RIGHT JOIN disques ON pistes.id_disque=disques.id_disque
RIGHT JOIN chansons ON pistes.id_chanson=chansons.id_chanson
RIGHT JOIN artistes ON pistes.id_disque=artistes.id_artiste
WHERE id_disque IN ('.implode(",", $disquesId).')
ORDER BY pistes.id_artiste, pistes.id_disque, pistes.id_piste
");
J'ai peut-être fait une erreur au niveau des quotes...
Précisément : tu as inversé.

Le truc : commence par écrire une requête SQL normale avec des valeurs en dur, sans PHP, sans variables;
Exemple :
SELECT *
FROM pistes
  RIGHT JOIN disques ON pistes.id_disque=disques.id_disque
  RIGHT JOIN chansons ON pistes.id_chanson=chansons.id_chanson
  RIGHT JOIN artistes ON pistes.id_disque=artistes.id_artiste
WHERE id_disque IN (1,2,3,4)
ORDER BY pistes.id_artiste, pistes.id_disque, pistes.id_piste
Ensuite, colle le tout entre les guillemets d'une variable, ça devient alors :
$asnwer = "SELECT *
FROM pistes
  RIGHT JOIN disques ON pistes.id_disque=disques.id_disque
  RIGHT JOIN chansons ON pistes.id_chanson=chansons.id_chanson
  RIGHT JOIN artistes ON pistes.id_disque=artistes.id_artiste
WHERE id_disque IN (1,2,3,4)
ORDER BY pistes.id_artiste, pistes.id_disque, pistes.id_piste";
Maintenant, on va remplacer les valeurs en dur par une valeur définie en PHP : comme on a utilisé des guillemets, on va utiliser encore des guillemets pour sortir de la syntaxe SQL. Mais je te suggère de créer cette valeur dans une autre variable en amont de ta requête, et ensuite seulement l'insérer dans la chaine SQL, comme ceci :
$cdIds = implode(',', $disquesId);
$asnwer = "SELECT *
FROM pistes
  RIGHT JOIN disques ON pistes.id_disque=disques.id_disque
  RIGHT JOIN chansons ON pistes.id_chanson=chansons.id_chanson
  RIGHT JOIN artistes ON pistes.id_disque=artistes.id_artiste
WHERE id_disque IN (". $cdIds .")
ORDER BY pistes.id_artiste, pistes.id_disque, pistes.id_piste";
Refais l'essai ;)

Quant au sujet de départ, je n'ai parcouru l'ensemble que rapidement en diagonale, mais le problème de modélisation de la base de données n'est pas à prendre à la légère, c'est en général le cœur de l'application, si tu construis une base bancale, l'application sera bancale. Par ailleurs, si ton modèle de données doit être remanié,n'oublie pas que ça voudra dire qu'il faudra refaire toutes les requêtes qui passent par les tables modifiées, et le code PHP qui va avec probablement aussi. Intéresse-toi à la méthode MERISE pour la modélisation de bases de données, il y a un bon tuto sur le sujet sur developpez.com. Bon courage :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: