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

Requêtes MySQL Discussion :

GROUP_CONCAT dans requête


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Par défaut GROUP_CONCAT dans requête
    Bonjour

    MySQL 5.1.30


    T1 (table messages)
    --ID
    --MSG
    --UID_to (varchar 255)

    T2 (table destinataires)
    --UID
    --Firstname
    --Lastname

    Je tente de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
    UID_to, 
    (SELECT GROUP_CONCAT(Lastname, ' ', Firstname) FROM T2 WHERE UID IN (UID_to)) AS UID_to_full
    FROM T1
    Mais la requête ne me retourne que les Lastname, Firstname du 1er UID

    Ex :
    Si j'ai dans T1
    UID_to = '1, 2'
    La requete ne me retourne que les lastname firstname de 1

    A mon avis, le pb doit venir de UID_to qui n'est pas :
    1, 2 ni '1', '2' mais '1, 2'

    Une idée ? ou une autre façon de faire ?
    Merci
    Samish

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Tu ne fais pas de GROUP BY
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Que d'horreurs !
    Désolé d'être aussi brutal mais il y a de quoi !

    A mon avis, le pb doit venir de UID_to qui n'est pas :
    1, 2 ni '1', '2' mais '1, 2'
    Ceci me fait comprendre que UID_to est en fait une colonne mulivaluée, ce qui n'est pas du tout conforme aux principes d'une BDD relationnelle.

    Le modèle devrait être :
    Message -1,n----Adresser----0,n- Destinataire

    Ce qui donne non pas deux mais trois tables :
    Destinataire(UID, firstname, lastname)
    Message (ID, MSG)
    Adresser (ID_Message, UID_Destinataire)

    Ensuite la requête contient un GROUP_CONCAT qui, comme son nom l'indique est une fonction de regroupement. Pour assembler deux colonnes, c'est CONCAT !

    Avec le bon modèle de données, il suffirait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT m.ID AS ID_Message, m.MSG AS Message,
      CONCAT(d.Lastname, ' ', d.Firstname) AS Destinataire
    FROM Message AS m
    INNER JOIN Adresser AS a ON m.ID = a.ID_Message
      INNER JOIN Destinataire AS d ON a.UID_Destinataire = d.UID
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Par défaut
    Bonjour,

    1/ Merci de vos réponses

    2/ Pas de panique : ce sont des tests que je réalise

    3/ Maljuna Kris : merci mais le GROUP BY n'y change rien

    4/ CinePhil :
    - merci
    - j'utilise toujours le modèle que tu préconises

    5/ Ce qui me pousse à faire ces tests :
    - A quoi servent les check box en client side s'il faut les spliter ?
    - A quoi peut servir la FIND_IN_SET ?

    6/ Sous MS SQLServer j'utilise un UDF -qui est plus rapide que la jointure dans certains cas-, mais je n'arrive pas à la porter sous MySQL.

    7/ 1, 2 ni '1', '2' mais '1, 2' :
    SI je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE CAST(UID_to AS CHAR) IN ('1','2') => OK
    WHERE UID_to IN (1,2) => OK
    WHERE UID_to IN ('1,2') => NOT OK
    8/ SOLUTION -à tester- (cf limitations VARCHAR(255) de UID et de FIND_IN_SET):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
    T1.UID_to, 
    (SELECT GROUP_CONCAT(T2.Lastname, ' ', T2.Fistrname) FROM T2 WHERE FIND_IN_SET (T2.ID, Replace(T1.UID_to, ' ', ''))>0) AS UID_to_full
    FROM T1
    Samish

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Samish Voir le message
    4/ CinePhil :
    - merci
    - j'utilise toujours le modèle que tu préconises
    Ouf ! Me voilà rassuré !

    5/ Ce qui me pousse à faire ces tests :
    - A quoi servent les check box en client side s'il faut les spliter ?
    - A quoi peut servir la FIND_IN_SET ?
    Euh... on est encore dans MySQL là ?

    8/ SOLUTION -à tester- (cf limitations VARCHAR(255) de UID et de FIND_IN_SET):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
    T1.UID_to, 
    (SELECT GROUP_CONCAT(T2.Lastname, ' ', T2.Fistrname) FROM T2 WHERE FIND_IN_SET (T2.ID, Replace(T1.UID_to, ' ', ''))>0) AS UID_to_full
    FROM T1
    Samish
    Encore une fois, le GROUP_CONCAT ne me semble pas la bonne fonction puisque c'est une fonction de regroupement. CONCAT devrait suffire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Par défaut
    No problémo

    1/ on est encore dans MySQL là ?

    -A-Pour les check box, non pas directement

    -B-Pour FIND_IN_SET, oui je crois :
    FIND_IN_SET

    2/ "Encore une fois, le GROUP_CONCAT ne me semble pas la bonne fonction puisque c'est une fonction de regroupement. CONCAT devrait suffire."

    -A- Si j'utilise un simple concat, MySQL n'acceptera pas de retourner
    un "Resultset data" dans une "ligne"

    En effet, je ne l'ai peut être pas dit mais ce code figure
    dans une vue (jointures sur 5 tables)

    -B- Le CONCAT dont tu parles est implicitement effectué par GROUP_CONCAT
    quand on lui passe 2 champs GROUP_CONCAT(T2.Lastname, ' ', T2.Fistrname)

    3/ Je vais tester sur une "petite" messagerie interne, s'il a de gros pb je vous
    tiens au courant.

    Samish

  7. #7
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Ce que tu ne sembles pas comprendre, c'est que GROUP_CONCAT est à CONCAT ce que SUM est à +, les premiers agissent par regroupement de lignes, les deuxièmes par regroupement de colonnes.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 91
    Par défaut
    Bonjour,

    Je crois que je n'ai pas été clair dans la description de mon pb :
    Je dois faire regroupement de lignes ET sur chaque ligne un regroupement
    de colonnes.

    Le code exact est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
    T1.UID_to, 
    (SELECT GROUP_CONCAT(CONCAT(T2.Lastname, ' ', T2.Fistrname)) FROM T2 WHERE FIND_IN_SET (T2.ID, REPLACE(T1.UID_to, ' ', ''))>0) AS UID_to_full
    FROM T1
    Mais dans des expemples trouvés sur le web, l'omission du CONCAT
    est permise.

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

Discussions similaires

  1. [Visual Web] [SJSC] Concaténation dans requête SQL
    Par Original Prankster dans le forum NetBeans
    Réponses: 22
    Dernier message: 15/08/2005, 14h50
  2. Procédure stockée, concaténation dans requête
    Par sbeu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2005, 12h03
  3. ASP et valeur NULL dans requêtes SQL
    Par chuck_m dans le forum ASP
    Réponses: 7
    Dernier message: 13/08/2004, 11h15
  4. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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