Concaténer les lignes d'une colonne, selon un critère, dans une autre table...
Résolu
Recoh23
-
jordane45 Messages postés 38480 Date d'inscription Statut Modérateur Dernière intervention - 23 janv. 2021 à 00:48
jordane45 Messages postés 38480 Date d'inscription Statut Modérateur Dernière intervention - 23 janv. 2021 à 00:48
A voir également:
- Concaténer les lignes d'une colonne, selon un critère, dans une autre table...
- Déplacer une colonne excel - Guide
- Table ascii - Guide
- Trier une colonne excel - Guide
- Table des matières word - Guide
- Formule somme excel colonne - Guide
6 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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)
J'ai réussi ! han !
MERCI !!
SELECT GROUP_CONCAT( label SEPARATOR ' ' ) AS descriptif_menu
FROM produits
WHERE menu = '1'
GROUP BY menu ;
MERCI !!
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 ;
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
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.