PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 10-05-2011 13:33:50

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Requête jointe sur 3 tables et l'affichage de son résultat

Bonjour,
Aujourd'hui, j'essaye d'optimiser une page qui actuellement fonctionne, mais qui fera bondir les puristes si ils en voient le code...

Bref, j'ai besoin des infos de trois tables :
- une table ingredients qui contient un id, un nom, et une classe_id (clé étrangère)
- une table classes, qui contient aussi un id, un nom complet et un nom raccourci
- une table membres_ingredients qui contient un membre_id et un ingredient_id

L'objectif final est l'affichage d'une liste présentée par classes contenant tous les ingrédients que le membre N'a PAS.
L'idée est de lui permettre de cliquer sur les éléments de cette liste pour justement indiquer que dorénavant il les a.

La technique initiale utilisée était sur le principe de faire une première boucle WHILE sélectionnant les classes, puis dans cette boucle de sélectionner les ingrédients appartenant à cette classe avec un WHERE et d'affiner la liste avec un AND ingredient_id NOT IN et un autre SELECT prenant les ingrédients possédés par le membre.

C'est fonctionnel, mais euh...pas très optimisé, on va dire.

Je voudrais donc faire une requête jointe sur trois tables. Je me débrouille à peu près avec les deux premières mais je ne sais pas comment formuler qu'il faut filtrer avec la troisième.

Pour l'instant j'ai...

    $sqlIngredients = 'SELECT
            ing.ingredient_id, ing.ingredient_nom, ing.classe_id,
            classes.ingredient_classe, classes.classe_id, classes.classe_courte,
            mbIng.membre_id, mbIng.ingredient_id
            FROM ingredients AS ing
              JOIN classes ON ing.classe_id = classes.classe_id
            JOIN membres_ingredients AS mbIng ON mbIng.ingredient_id = ing.ingredient_id               
            ORDER BY classes.ingredient_classe ASC';
    $exeIngredients = mysql_query($sqlIngredients) or die(mysql_error());

...et évidemment, ça ne m'affiche pas ce que j'attends, vu que de toute façon la condition ON n'est pas bonne.
Donc justement, comment la rendre bonne ? C'est possible de faire un != ? Quand j'essaye, ça ne m'affiche absolument pas ce que j'attends non plus, bien sûr.
Bref, j'apprécierais énormément vos lumières !

Merci !

Hors ligne

#2 10-05-2011 14:39:37

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Saluton,
C'est qu'il te faut faire une LEFT OUTER JOIN sur la table membres et ajouter une clause WHERE mbIng.ingredient_id IS NULL.
Tout simplement.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 10-05-2011 15:09:27

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Requête jointe sur 3 tables et l'affichage de son résultat

J'ai rajouté la condition AND mbIng.membre_id = "'.$_SESSION['membre_id'] à cette LEFT OUTER JOIN et Ô Miracle, les résultats semblent cohérents !
Merci (encore !) Maljuna.
Hum maintenant passons à l'exploitation des résultats pour gérer l'affichage des ingrédients par classes sans répéter à chaque fois le nom de la classe...
A bientôt, donc wink

Hors ligne

#4 10-05-2011 15:17:05

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Mendoza a écrit :

J'ai rajouté la condition AND mbIng.membre_id = "'.$_SESSION['membre_id'] à cette LEFT OUTER JOIN et Ô Miracle, les résultats semblent cohérents !)

Logique, sinon tu obtiens la liste des ingrédients possédés par aucun membre.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 11-05-2011 13:34:07

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Bon j'ai honte. En exploitant les résultats, je me rends compte que je ne peux pas utiliser l'ingredient_id de la table ingredients.
Je suis partagé entre deux explications :
- ou bien j'ai bouletté dans l'exploitation de la requête avec une faute de frappe ou quelque chose comme ça (ce qui m'arrive TRES fréquemment),
- ou bien la condition WHERE mbIng.ingredient_id IS NULL empêche de récupérer les ID des ingrédients affichés. Vu que c'est ma première requête de ce type, je ne saurais trop dire si c'est ça...
Pourtant, j'ai quand même besoin de pouvoir exploiter l'ID de l'ingredient que le membre ne possède pas encore, vu que en cliquant sur cet ingrédient, le membre l'ajoute à sa liste, et donc à la table mbIng, dans la colonne ingredient_id.
Comment puis-je sortir de cette impasse ?

Hors ligne

#6 11-05-2011 14:42:14

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Saluton,
En fait, dans la requête, si mbIng.ingredient_id IS NULL, ing.ingredient_id lui ne l'est pas.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#7 11-05-2011 14:46:22

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Oui mais pourtant quand je fais un "while ($ingredients = mysql_fetch_assoc($exeIngredients)){echo $ingredients['ingredient_nom'];}, cela m'affiche bien la liste des ingrédients que le membre n'a pas, mais quand je fais la même chose avec 'ingredient_id', il n'affiche rien, alors que spontanément je pensais qu'il m'afficherait la liste de leur ID.
C'est donc là que je fais quelque chose de mauvais ?

EDIT : Bon en mettant un alias après ing.ingredient_id AS ingID et ensuite en affichant 'ingID', ça me les met bien comme il faut. Il devait y avoir une confusion entre les mbIng.ingredient_id et les ing.ingredient_id. C'est la bonne technique pour s'en sortir ?

Dernière modification par Mendoza (11-05-2011 14:50:52)

Hors ligne

#8 11-05-2011 15:15:10

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Mendoza a écrit :

EDIT : Bon en mettant un alias après ing.ingredient_id AS ingID et ensuite en affichant 'ingID', ça me les met bien comme il faut. Il devait y avoir une confusion entre les mbIng.ingredient_id et les ing.ingredient_id. C'est la bonne technique pour s'en sortir ?

Oui, et si tu utilisais PDO tu saurais cela depuis longtemps. wink


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 11-05-2011 15:20:35

Mendoza
Membre
Inscription : 02-03-2011
Messages : 31

Re : Requête jointe sur 3 tables et l'affichage de son résultat

Il me reste encore tant de choses à apprendre, Maiiiiiiiitre wink

Hors ligne

Pied de page des forums