IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Ecriture d'une requête [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Ecriture d'une requête
    Bonjour à toutes et tous,

    Voici ma requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_com as id, com_type as type, com_prix as prix, com_contexte as contexte, bbir_activite as activite
    FROM bbir_commerces
    JOIN bbir_c_activites_exercees ON fk_id_com = idbbir_com
    JOIN bbir_activite ON idbbir_activite = c_fk_id_activite
    ORDER BY com_creation DESC

    Elle est fonctionnelle et retourne 1 ligne si une seule activité, 3 lignes si 3 activités.
    Je voudrais savoir comment écrire cette requête pour 'concaténer' les activités dans un seul champs ? ou à défaut comment réaliser le regroupement avec PHP ?
    Espérant avoir été assez clair, je vous remercie de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- une solution SQL possible ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP_CONCAT(... ORDER BY ... ASC SEPARATOR ', ')
    2- Sinon en PHP :
    • soit séparer en 2 requêtes
    • soit bidouiller...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Re, merci de votre aide.
    Si je fais
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idbbir_commerces as id, com_type as type, com_prix as prix, com_contexte as contexte, GROUP_CONCAT (bbir_activite) as activite FROM bbir_commerces JOIN bbir_c_activites_exercees ON fk_id_commerce = idbbir_commerces JOIN bbir_activite ON idbbir_activite = c_fk_id_activite ORDER BY com_creation DESC
    j'obtiens :
    #1370 - execute command denied to user ... for routine GROUP CONCAT (dans PMA)
    Si je fais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idbbir_commerces as id, com_type as type, com_prix as prix, com_contexte as contexte, CONCAT(bbir_activite) as activite FROM bbir_commerces JOIN bbir_c_activites_exercees ON fk_id_commerce = idbbir_commerces JOIN bbir_activite ON idbbir_activite = c_fk_id_activite GROUP BY id ORDER BY com_creation DESC
    je n'obtiens que l'activité 1

    ou je n'ai pas compris ta solution ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Essaie :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	COM.id_com AS id, 
    	COM.com_type AS type, 
    	COM.com_prix AS prix, 
    	COM.com_contexte AS contexte,
    	GROUP_CONCAT( ACT.bbir_activite ORDER BY ACT.bbir_activite ASC SEPARATOR ', ') AS list_activites
    FROM bbir_commerces COM
    JOIN bbir_c_activites_exercees ACX 
    	ON ACX.fk_id_com = COM.idbbir_com
    JOIN bbir_activite ACT 
    	ON ACT.idbbir_activite = ACX.c_fk_id_activite
    ORDER BY COM.com_creation DESC
    N.B. COM, ACT et ACX sont des ALIAS des noms des tables.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    La requête renvoie :
    Warning: #1260 Row 94 was cut by GROUP_CONCAT()

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est peut-être une ligne SANS "activité" ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Eh, non ! car les activités sont OBLIGATOIREMENT renseignées (ne peuvent être ni NULL, ni vides)

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    il faut pouvoir augmenter la taille de la variable sysvar_group_concat_max_len censée limitée le contenu du GROUP_CONCAT. Par défaut cette variable est 1024.Pour modifier cette variable sur PMA, le menu PLUS => Variables => sysvar_group_concat_max_len

    https://dev.mysql.com/doc/refman/5.7...concat_max_len

    perso je préfère effectuer ce regroupement en PHP pour plus de portabilité.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    bonjour @armel18
    La taille est très largement suffisante car une activité c'est maximum 45 char et j'ai un maximum de 3 à 4 activités pour un enregistrement.
    La solution en PHP c'est de faire -ci-dessous- ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while ($res = $biens->fetch() )
    {
       $activiesexercees .= $res['activite'] ;
    }

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    Il y a encore une autre solution. Tu remplaces GROUP_CONCAT par JSON_ARRAYAGG
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	COM.id_com AS id, 
    	COM.com_type AS type, 
    	COM.com_prix AS prix, 
    	COM.com_contexte AS contexte,
    	JSON_ARRAYAGG( ACT.bbir_activite ) AS list_activites
    FROM bbir_commerces COM
    JOIN bbir_c_activites_exercees ACX 
    	ON ACX.fk_id_com = COM.idbbir_com
    JOIN bbir_activite ACT 
    	ON ACT.idbbir_activite = ACX.c_fk_id_activite
    ORDER BY COM.com_creation DESC

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Je pensais que JSON_ARRAYAGG() c'était juste postgres SQL ! j'essaie

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    @armel18
    #1370 - execute command denied to user '...' for routine 'ma_base.JSON_ARRAYAGG'
    Non ce n'est pas la bonne solution, je sèche !

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- as-tu testé les requêtes directement dans phpMyAdmin ?

    Cela dit... je ne suis pas aussi calé en SQL... et ça me parait fastidieux


    2- Personnellement, je ferais 2 requêtes SQL :
    • la 1ère pour les données principales (SANS les JOIN)
    • la 2ème dans la boucle PHP (while ou foreach), pour récupérer les données de toutes les activités (A VEC les JOIN + WHERE id = ...)
    Dernière modification par Invité ; 08/04/2019 à 20h18.

  14. #14
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Le group concat fonctionne avec un group by. En effet pour qu’on puisse chaîner des données il faut bien qu’elles aient des critères communs.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select id, group_concat(champ)
    group by id
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  15. #15
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Un exemple. J'ai une liste d'auteurs dans la table auteur. Je veux mettre tous les noms d'auteurs sur une seule ligne.


    Nom : Capture20190408_001.JPG
Affichages : 240
Taille : 24,4 Ko

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT A.VAL, GROUP_CONCAT(nom) FROM 
    (SELECT 1 AS VAL) A
    INNER JOIN auteur B ON 0=0
    GROUP BY A.VAL

    Résultat :

    Nom : Capture20190408_002.JPG
Affichages : 238
Taille : 15,3 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    @badaze
    Ce n'est pas en montrant un exemple basique que tu résoudras le problème...
    (exemple qu'on trouve dans la doc GROUP_CONCAT)

    Ici, il s'agit d'aller chercher dans une table en jointure !


    N.B. Perso, je n'ai pas (encore) réussi...
    Mais je n'ai pas dit mon dernier mot.
    Dernière modification par Invité ; 09/04/2019 à 09h40.

  17. #17
    Invité
    Invité(e)
    Par défaut
    EUREKA (?)
    je pense toucher au but *.

    Essaie :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
    	DISTINCT COM.id_com AS id, 
    	COM.com_type AS type, 
    	COM.com_prix AS prix, 
    	COM.com_contexte AS contexte,
    	( SELECT GROUP_CONCAT( ACT.bbir_activite ORDER BY ACT.bbir_activite ASC SEPARATOR ', ') AS list_activites
    		FROM bbir_commerces COM2
    		JOIN bbir_c_activites_exercees ACX 
    			ON ACX.fk_id_com = COM2.idbbir_com
    		JOIN bbir_activite ACT 
    			ON ACT.idbbir_activite = ACX.c_fk_id_activite
    		WHERE COM2.id_com = COM.id_com
    	) AS list_activites
    FROM bbir_commerces COM
    ORDER BY COM.com_creation DESC
    J'ai testé avec des tables perso : ça semble fonctionner.

    * (ça m'a tilté ce matin, au réveil... )

  18. #18
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Et comme ça ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id_com as id, com_type as type, com_prix as prix, com_contexte as contexte, group_concat(bbir_activite) as activite
    FROM bbir_commerces
    JOIN bbir_c_activites_exercees ON fk_id_com = idbbir_com
    JOIN bbir_activite ON idbbir_activite = c_fk_id_activite
    group by 1, 2, 3, 4
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  19. #19
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    @badaze
    Ce n'est pas en montrant un exemple basique que tu résoudras le problème...
    (exemple qu'on trouve dans la doc GROUP_CONCAT)

    Ici, il s'agit d'aller chercher dans une table en jointure !
    Si l'exemple basique indique qu'il faut utiliser group by c'est peut-être pour une bonne raison.


    Ci-dessous un exemple avec des données de deux tables chez moi. Le bon résultat est donné par la troisième requête.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT m.id_master, d.comment  
    FROM `master` m
    INNER JOIN detail d on d.id_master = m.id_master
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    1 commento 1 argomento 1 
    1 commento 2 argomento 1 
    2 commento 1 argomento 2 
    2 commento 2 argomento 2 
    2 commento 3 argomento 2 
    2 commento 4 argomento 2 
    3 commento 1 argomento 3 
    3 commento 2 argomento 3 
    3 commento 3 argomento 3 
    3 commento 4 argomento 3 
    4 commento 1 argomento 4 
    4 commento 2 argomento 4 
    4 commento 3 argomento 4 
    4 commento 4 argomento 4 
    4 commento 5 argomento 4 
    5 commento 1 argomento 5 
    5 commento 2 argomento 5 
    5 commento 3 argomento 5 
    5 commento 4 argomento 5 
    5 commento 5 argomento 5 
    6 commento 1 argomento 6 
    6 commento 2 argomento 6
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT m.id_master, GROUP_CONCAT(d.comment)  
    FROM `master` m
    INNER JOIN detail d on d.id_master = m.id_master
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1 commento 1 argomento 1,commento 2 argomento 1,comm...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT m.id_master, GROUP_CONCAT(d.comment)  
    FROM `master` m
    INNER JOIN detail d on d.id_master = m.id_master
    GROUP by 1
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    1 commento 1 argomento 1,commento 2 argomento 1 
    2 commento 1 argomento 2,commento 2 argomento 2,comm... 
    3 commento 1 argomento 3,commento 2 argomento 3,comm... 
    4 commento 1 argomento 4,commento 2 argomento 4,comm... 
    5 commento 1 argomento 5,commento 2 argomento 5,comm... 
    6 commento 1 argomento 6,commento 2 argomento 6
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Alors là MERCI @ jreaux62
    Effectivement, après de toutes petites modifications (double quote à la place de simple ", ")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/08/2017, 16h38
  2. Ecriture d'une requète
    Par atk_49 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/02/2015, 10h34
  3. [AJAX] Ecriture dans un fichier json avec une requête AJAX
    Par DarkPoster14 dans le forum jQuery
    Réponses: 1
    Dernier message: 10/07/2012, 09h45
  4. Ecriture d'une variable dans une requête
    Par papilou86 dans le forum Access
    Réponses: 2
    Dernier message: 02/06/2006, 09h03
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo