Concaténer les lignes d'une colonne, selon un critère, dans une autre table...

Résolu/Fermé
Recoh23 - 22 janv. 2021 à 16:52
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 23 janv. 2021 à 00:48
Bonjour,

Configuration: Linux / Firefox 84.0


HTML, PHP, My SQL, PDO...

Novice en la matière, je recherche une syntaxe MySQL ou PDO correcte, tout ce que j'ai essayé s'est traduit par des erreurs sql !
Je créé le site d'un pote qui vend des produits sur les marchés et veut le promouvoir comme permettre à ses clients de réserver (pour le moment, puis offrir une solution de paiement/commande).
Il propose des plats et des menus (à meilleurs prix car plusieurs plats).
Sachant que :
- La table produits recèle la liste des produits (reference, label, description, prix, menu) ; la colonne menu renseigne le numéro du menu (1 à 3) dont le plat fait partie ou NULL s'il ne fait pas partie d'un menu.
- La table menus recense la liste des menus (menu, label_menu, descriptif_menu, prix_menu).
- J'ai déclaré la colonne menu (présente dans chaque table) comme PRIMARY_KEY dans la table menus alors que dans la table produits, c'est la reference la PRIMARY_KEY (je sais pas pourquoi, à quoi ça sert au final ?...)
- J'ai réussi à créer les menus dans la table menus avec cette syntaxe :
INSERT INTO menus VALUES ( 1, 'Menu de semaine', null, null );
(x3 en changeant le numéro de menu et le label_menu).

J'essaye de renseigner le champ descriptif_menu par la concaténation du champ label de tous les produits faisant partie du menu 1, pour le menu 1, 2 pour le menu 2
et 3 pour le menu 3.
Par exemple, le descriptif du menu du dimanche (3) sera composé du label des produits ayant le champ du menu à 3, séparés par virgule-espace. 2 à 3 produits sont susceptibles d'être présents par menu.
Ensuite, et plus dur : le prix_menu est la somme des prix des produits concernés par le même numéro de menu, dans la table produits, avec une remise de 20% !
Enfin, je veux construire un formulaire qui communique avec la BDD mySQL afin de modifier un produit dans la table (label, descriptif, prix, menu), et qu'une fois changé ou retiré d'un menu, cela modifie la table menu (le descriptif_menu et le prix_menu) selon les mêmes règles.

Si j'arrive à ce résultat, il ne restera plus qu'une marche pour mon pote pour faire du clic-collect et il m'offre une de ses guitares !!!

Voulez-vous m'aider à construire ces requêtes qui sont complexes vu la simplicité de celles que je trouve dans les tutos, tout ça ?
A voir également:

6 réponses

yg_be Messages postés 22728 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
22 janv. 2021 à 17:49
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
22 janv. 2021 à 18:07
Bonjour,


r la concaténation du champ label de tous les produits faisant partie du menu 1,

Déjà, avant de le code dans ton PHP, il est préférable d'écrire ses requêtes et de les tester dans mysql.
Donc, pour répondre à ta question,
je pense que tu peux te pencher sur la fonctions sql GROUP_CONCAT avec GROUP BY
Un truc du genre
SELECT GROUP_CONCAT(label) AS DETAIL_MENU
FROM tatable
GROUP BY menu

Si le resultat obtenu est conforme à tes attentes, tu pourras ensuite faire une requête de mise à jour de tes menus via une requête UPDATE.

Mais bon,
Pour moi, ton champ description n'est pas utile.
En effet, lorsque tu vas requêter ta bdd pour avoir la liste des menus, il te suffira de faire une jointure pour obtenir cette description....
Sans avoir à la stocker dans ta bdd.
Car si tu changes un produit .. il te faudra à nouveau générer ta description... ce qui n'est pas super fiable.

0
Merci de ta réponse si rapide !!
Je vais essayer mais j'ai une question : le type de champ est commun à toutes les variables : varchar, je pense qu'avec un type différent.. mais je testerai
Par contre, le "DETAIL_MENU", c'est une commande ? un champ de ma table menu.sql ?
Du coup je comprends l'inutilité d'une table menu à partir du moment où la requête fonctionne... Ça va simplifier la construction de la page et du formulaire...
En fait je connais pas toutes les possibilités ni toutes les commandes et leurs intrications, mais j'y vais ! pas à pas !
je teste
0
J'ai testé :

SELECT GROUP_CONCAT(label) AS DETAIL_MENU
FROM produits
GROUP BY menu = 1;

et :

SELECT GROUP_CONCAT(label) AS menus.descriptif_menu
FROM produits
GROUP BY menu = 1;

et ça a donné :
import.php: Missing parameter: import_type (FAQ 2.8)
import.php: Missing parameter: format (FAQ 2.8)
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 22 janv. 2021 à 21:27
Que vient faire ce = 1 ici ???
Si tu veux ne le faire que pour le menu 1, il faut mettre un WHERE avant le group by
0
J'ai réussi ! han !

SELECT GROUP_CONCAT( label SEPARATOR ' ' ) AS descriptif_menu
FROM produits
WHERE menu = '1'
GROUP BY menu ;


MERCI !!
0
Comme ça créé un alias le AS, une autre fonction doit pouvoir écrire le résultat dans la table menus ?
Je vais chercher..

De toutes façon je pense que la table menus va sauter...
;)
Merci encore
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Recoh23
Modifié le 23 janv. 2021 à 00:34
pourquoi faire sauter la table menu ?

Au niveau conception de la base de données .. mois je ferai 3 tables
Table menu (id, libelle, prix )
Table produits (id, libelle, description, prix .. )
Table produits_menu(id, id_menu, id_produit ) ( cette table contiendra autant de lignes que de produit pour chaque menu .. c'est une table d'association ... surtout qu'un même produit peut se trouver dans plusieurs menus... )

Un conseil ... avant de commencer à coder ... tu as sauter pas mal d'étapes visiblement...
On commence par faire un cahier des charges pour décrire en grosses lignes le projet
Puis on fait un cahier des spécificités fonctionnelles dans lequel on décrit chaque fonctionnalité dont tu auras besoin
Et ensuite, on réfléchi au modèle de la base de données.
Une fois toutes ces étapes réalisées.. là on peut commencer à coder !

Et j'insiste .. il n'est pas du tout nécessaire de "stocker" la concaténation des produits dans un quelconque champ description de ta table menu....
Cette information là, tu peux la requêter directement lorsque tu en as besoin.
La stocker risque de générer des erreurs si jamais tu retires un produit ou que tu le renommes... ça t'obligerait à regénérer la concaténation et à la restocker ... aucun intéret
Surtout qu'en terme de performances, faire la requête uniquement quand tu en as besoin ne posera aucun souci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Elle est là !! :

UPDATE menus SET descriptif_menu = (SELECT GROUP_CONCAT(label SEPARATOR ' , ') FROM produits WHERE menu = '1' GROUP BY menu) WHERE menu = 1 ;
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
23 janv. 2021 à 00:39
CA NE SERT A RIEN ... à croire que tu ne lis pas les réponses que je te donne.....
0
Recoh Messages postés 37 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 2 mars 2021
23 janv. 2021 à 00:45
Si si ! je viens de lire la réponse précédente, je comprends bien le souci d'une table en trop et la rapidité d'une requête (niveau gain de temps), mais jouer avec ce code et trouver un truc qui roule c'est ludique. Pour le "job" je continue à écouter vos conseils.
Merci d'ailleurs ils sont précieux
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
23 janv. 2021 à 00:48
Je préfère ça. :-)

Bon, dernier conseil pour la soirée...
>Vu que tu fais du PDO, je t'invite à appliquer les conseils ("consignes") données ici :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Ainsi que là :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

N'hésites pas à revenir nous montrer ton code si tu rencontres des difficultés. (dans une nouvelle discussion propre à chaque "problématique" )
et pense à marquer ce sujet en résolu.

Bonne soirée.
0