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 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 23 janv. 2021 à 00:48
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 23 janv. 2021 à 00:48
A voir également:
- Concaténer les lignes d'une colonne, selon un critère, dans une autre table...
- Table ascii - Guide
- Déplacer une colonne excel - Guide
- Table des matières word - Guide
- Formule somme excel colonne - Guide
- Aller à la ligne dans une cellule excel - Guide
6 réponses
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
Ambassadeur
1 554
22 janv. 2021 à 17:49
22 janv. 2021 à 17:49
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
22 janv. 2021 à 18:07
22 janv. 2021 à 18:07
Bonjour,
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
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.
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.
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
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
J'ai testé :
et :
et ça a donné :
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)
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
Modifié le 22 janv. 2021 à 21:27
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
Si tu veux ne le faire que pour le menu 1, il faut mettre un WHERE avant le group by
J'ai réussi ! han !
MERCI !!
SELECT GROUP_CONCAT( label SEPARATOR ' ' ) AS descriptif_menu
FROM produits
WHERE menu = '1'
GROUP BY menu ;
MERCI !!
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
>
Recoh23
Modifié le 23 janv. 2021 à 00:34
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.
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.
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 ;
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
23 janv. 2021 à 00:39
23 janv. 2021 à 00:39
CA NE SERT A RIEN ... à croire que tu ne lis pas les réponses que je te donne.....
Recoh
Messages postés
36
Date d'inscription
dimanche 19 juillet 2020
Statut
Membre
Dernière intervention
2 mars 2021
23 janv. 2021 à 00:45
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
Merci d'ailleurs ils sont précieux
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
23 janv. 2021 à 00:48
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.
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.