Syntaxe de l'enregistrement d'une variable qui peut avoir plusieurs valeurs [Résolu]

Signaler
Messages postés
37
Date d'inscription
dimanche 19 juillet 2020
Statut
Membre
Dernière intervention
2 mars 2021
-
Messages postés
32299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mai 2021
-
Bonjour,

Je recherche encore, sans arriver à trouver si c'est faisable, ou pas, via une ou plusieurs requêtes, comment enregistrer plusieurs valeurs dans un seul et même champ (int ? varchar ?...), et selon cette chaîne de valeur, qui n'est pas unique, comment faire correspondre à chaque valeur, une variable d'une autre table ?

Je m'explique :
J'ai créé une petite BDD pour le site promotionnel d'un pote traiteur, qui recèle 3 tables : une table produits, une table menus et une table evenements. La première recèle les plats et produits qu'il propose à la vente (reference,label,description,menu), et la seconde recèle les menus qu'il propose à l'occasion d'événements (menu,label_menu,descriptif_menu). J'essaye de mettre en lien les deux champs menu de chaque table, afin que lorsque j'affiche la page des menus, j'aie la liste des plats au choix par menu. Par exemple, si je prends le menu 1, j'ai le choix entre deux entrées, deux plats et deux ou trois desserts et un choix de sauce épicée ou autre. De cette façon, un produit peut être proposé au choix dans tous les menus, ou un produit peut ne faire partie que de trois menus différents, ou aucun. Le système de menus permet de regrouper pour un même tarif, un choix de plats différents mais qui sont dans une même gamme de prix à l'unité.
On m'a conseillé de créer une table produits_menus qui pourrait permettre la jointure entre les deux tables. On m'a mit sur la voie d'une requête qui passerait par la table "lien" avec deux left join mais je ne comprends pas le fonctionnement de la requête et sous cette forme, l'explication est introuvable sur les sites dédiés. À moins de savoir de quoi on parle...
Je sais faire une requête update avant un select, afin d'obtenir le descriptif_menu par les label.produits, en utilisant group_concat, mais je ne sais pas donner plusieurs valeurs au champ menu ; ce qui me permettrait d'afficher le libellé d'un produit dans différents menus.
Je cherche donc le moyen d'écrire dans une table (que ce soit celle des produits ou une autre) que le produit rentre dans plusieurs menus et effectuer une requête select pour afficher les libellés des produits présents dans chaque menu qui en fait référence.
J'espère avoir été assez clair, je bloque là-dessus, c'est peut-être infaisable, peut-être faut-il passer par plusieurs champs menu par produit, chacun renseigné de façon unique et les requêtes adéquates ?
...
S'il vous plaît de m'aider à résoudre ce problème ?!

:]

3 réponses

Messages postés
32299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mai 2021
3 452
Bonjour,

Donc, encore une fois, ta colonne "descriptif" est inutile et n'a pas à être stockée directement en BDD...

Voici un exemple :

(Créé toi une BDD de teste et utilise le script ci-dessous pour y créer les tables )

CREATE TABLE IF NOT EXISTS `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `libelle` varchar(50) DEFAULT NULL,
  `prix` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `plats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `libelle` varchar(50) DEFAULT NULL,
  `prix_carte` decimal(10,2) DEFAULT NULL COMMENT 'prix à la carte ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `menus_plats` (
  `id_menu` int(11) DEFAULT NULL,
  `id_plat` int(11) DEFAULT NULL,
  KEY `id_menu` (`id_menu`),
  KEY `id_plat` (`id_plat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DELETE FROM `menus_plats`;
INSERT INTO `menus_plats` (`id_menu`, `id_plat`) VALUES
	(1, 1),
	(1, 5),
	(2, 2),
	(2, 4);

DELETE FROM `plats`;
INSERT INTO `plats` (`id`, `libelle`, `prix_carte`) VALUES
	(1, 'Galette jambon', 6.00),
	(2, 'Galette au Saumon', 6.50),
	(3, 'Steack Frittes', 9.00),
	(4, 'Crêpe Caramel', 9.00),
	(5, 'Sorbet', 9.00);

DELETE FROM `menu`;
INSERT INTO `menu` (`id`, `libelle`, `prix`) VALUES
	(1, 'Menu 1', 10.00),
	(2, 'Menu 2', 9.00);



Maintenant... regarde ce que fait cette requête
SELECT M.libelle AS MENU_LIBELLE
      ,M.prix AS PRIX_MENU
		,GROUP_CONCAT(P.libelle SEPARATOR ', ') AS DESCRIPTION_MENU    
FROM menus_plats MP
LEFT JOIN menu M ON M.id = MP.id_menu
LEFT JOIN plats P ON P.id = MP.id_plat
GROUP BY M.id

Messages postés
37
Date d'inscription
dimanche 19 juillet 2020
Statut
Membre
Dernière intervention
2 mars 2021

Merci de ta réponse jordane45, je comprends maintenant le lien entre la table jointure et les deux tables plats et menus. En entrant chaque lien entre un plat et un menu dans la table jointure, j'obtiens toutes les données des menus en une seule requête select alors qu'un plat peut figurer dans plusieurs menus. Cependant, j'ai aussi besoin de l'id_menus, je vais essayer de rajouter ça à la requête...
Messages postés
32299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mai 2021
3 452
SELECT M.id as ID_MENU
         , M.libelle AS MENU_LIBELLE
        , M.prix AS PRIX_MENU
		, GROUP_CONCAT(P.libelle SEPARATOR ', ') AS DESCRIPTION_MENU    
FROM menus_plats MP
LEFT JOIN menu M ON M.id = MP.id_menu
LEFT JOIN plats P ON P.id = MP.id_plat
GROUP BY M.id
Messages postés
37
Date d'inscription
dimanche 19 juillet 2020
Statut
Membre
Dernière intervention
2 mars 2021

Oui c'est bien ce que j'ai obtenu, merci encore pour ta réponse, et rapide !
Messages postés
32299
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 mai 2021
3 452
N'oublie pas de mettre le sujet en RESOLU.

Bonne journée.