Se connecter / S'enregistrer
Votre question

jointure de table complexe

Tags :
  • photo
  • Programmation
Dernière réponse : dans Programmation
10 Décembre 2011 15:49:28

Bonjour,
voici mon problème, que je n'arrive pas à résoudre. J'ai fait une requête sql pour afficher le résultat de la jointure de 2 tables. Mais il me manque l'affichage d'un champ.
les tables:
menu

articles

ma requête:
  1. SELECT articles.titre, articles.'description', articles.prix, articles.photo, menu.id_menu, menu.item_menu, menu.id_menu_dir, articles.reference
  2. FROM articles, menu
  3. WHERE articles.ref_menu=menu.id_menu
  4. ORDER BY id_menu ASC

les champs voulus de la table articles sont visibles, les champs sous menus de la table menu également, mais il manque les champs du menu principal, identifiés par id_menu_dir.
une image fabriquée pour expliquer ma demande:

j'ai essayé avec une autre requête:
  1. SELECT articles.reference,articles.prix,articles.description,articles.titre,m1.id_menu,m1.item_menu,m2.id_menu,m2.item_menu
  2. FROM articles
  3. INNER JOIN menu AS m1 ON m1.id_menu = articles.ref_menu
  4. INNER JOIN menu AS m2 ON m2.id_menu = m1.id_menu_dir

là c'est le contraire j'ai les éléments du menu principal, pas des sous menus, ce n'est peut-être pas possible ou j'ai fait une erreur.
Avez-vous une idée pour construire cette requête. Merci

Autres pages sur : jointure table complexe

a c 232 L Programmation
a b w Photo
10 Décembre 2011 15:58:20

Salut,

Pas le temps de tester plus que ça, mais t'aurais pas inversé ton deuxième inner join ?
  1. ...
  2. INNER JOIN menu AS m2 ON m2.id_menu_dir = m1.id_menu

10 Décembre 2011 16:12:40

merci de ta réponse , inversé çà donne rien.
Contenus similaires
Pas de réponse à votre question ? Demandez !
a c 232 L Programmation
a b w Photo
10 Décembre 2011 19:16:19

Sinon la technique, c'est de faire ta requête qui retourne tes menus et leurs descriptions.
Un truc du genre :
  1. SELECT *
  2. FROM menu m1
  3. INNER JOIN menu m2 ON m1.id_menu_dir = m2.id_menu


Et une fois que tu as ta requête qui fonctionne (si je me suis pas planté, ça devrait être le cas), tu la mets en tant que sous requête dans ton FROM.

Et ça te donne quelque chose comme ça :
  1. SELECT *
  2. FROM articles, (SELECT * FROM menu m1 INNER JOIN menu m2 ON m1.id_menu_dir = m2.id_menu) AS menus
  3. WHERE articles.ref_menu = menus.id_menu


A toi après de limiter un peu les colonnes retournées dans le SELECT * et ça devrait le faire.
10 Décembre 2011 19:30:48

réponse: nom du champ id_menu déjà utilisé, zut
a c 232 L Programmation
a b w Photo
10 Décembre 2011 22:12:31

arrange le select * comme indiqué
11 Décembre 2011 01:22:02

j'ai mis çà, sans changement:
  1. SELECT articles.titre, articles.prix
  2. FROM articles, (SELECT menu.item_menu FROM menu m1 INNER JOIN menu m2 ON m1.id_menu_dir = m2.id_menu) AS menus
  3. WHERE articles.ref_menu = menus.id_menu
a c 232 L Programmation
a b w Photo
11 Décembre 2011 10:19:16

Tu ne peux pas faire un SELECT menu.item_menu alors que tu as mis un alias m1 et m2 à tes tables.
Tu peux faire un SELECT m1.item_menu ou un SELECT m2.item_menu

Et puis, vu que tu fais une jointure sur la colonne id_menu, il faut forcément la sélectionner dans ton SELECT imbriqué
11 Décembre 2011 11:10:16

  1. SELECT articles.titre, articles.prix
  2. FROM articles, (SELECT m1.item_menu, m2.item_menu FROM menu m1 INNER JOIN menu m2 ON m1.id_menu_dir = m2.id_menu) AS menus
  3. WHERE articles.ref_menu = menus.id_menu

il me faut donc 2 item_menu, 1 pour les menus principaux et 1 pour les sous menus, ca me renvoi:
Nom du champ 'item_menu' déjà utilisé.
a c 232 L Programmation
a b w Photo
11 Décembre 2011 15:08:41

Qu'est ce que tu racontes ?


Bon, 1ère étape, tu fais juste ta requête pour sélectionner tes menus avec leur description et tout le bordel.
On fera la liaison avec les articles après.
Fais voir ta requête une fois qu'elle est prête.
11 Décembre 2011 17:22:56

Avec un peu d'aide, je crois que cette requête, va le faire:
  1. SELECT titre,m1.item_menu as 'menu parent', m2.item_menu as 'menu enfant'
  2. FROM menu m1, menu m2,articles
  3. WHERE m1.id_menu=m2.id_menu_dir
  4. and ref_menu=m2.id_menu

Merci beaucoup, omar pour ta participation et ta ténacité. j'aurais sûrement besoin encore de tes conseils.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS