Vous n'êtes pas identifié(e).
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...
...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
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
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
Hors ligne
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
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
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
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
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.
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
Il me reste encore tant de choses à apprendre, Maiiiiiiiitre
Hors ligne