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 :

Pourquoi le nombre de champs dans le GROUP BY est différent du nombre de champs du SELECT ?


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 392
    Points : 863
    Points
    863
    Par défaut Pourquoi le nombre de champs dans le GROUP BY est différent du nombre de champs du SELECT ?
    bonjour,

    je lisais la doc de la fonction GROUP_CONCAT qui ne marche qu'avec une clause GROUP BY.
    En bas de page de https://sql.sh/fonctions/group_concat
    on a l'exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT `titre`, `date_publication`, GROUP_CONCAT(`mot` SEPARATOR " ") AS concat_mot
    FROM `article`
    LEFT JOIN `mot_cle` ON `article_id` = `article`.`id`
    GROUP BY `article`.`id`

    Pourquoi dans le GROUP BY, il y a uniquement ID ? moi j'aurai mis titre et date_publication (et en plus, ID n'est pas présent dans le SELECT!)


    Erreur de doc ou bien il y a qqchose que je ne comprends pas bien ?

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Le tuto est un peu ancien, mais tu devrais trouver des réponses ici Démythifier le GROUP BY

    Voir aussi MySQL gère-t-il le GROUP BY comme les autres SGBD ?

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Bonjour,

    C'est là qu'on voit l'utilité de toujours préfixer les noms de colonnes par le nom (ou l'alias) de la table...

    Sans connaître la structure des tables utilisées dans la requête de l'exemple, on peut supposer :
    1. La colonne ID est l'identifiant (clé primaire) de la table ARTICLE
    2. Les colonnes TITRE et DATE_PUBLICATION appartiennent à la table ARTICLE
    3. Les colonnes MOT et ARTICLE_ID appartiennent à la table MOT_CLE
    4. A la même date de publication, il n'y a pas deux articles portant le même titre donc (TITRE, DATE_PUBLICATION) est la clé fonctionnelle de la table ARTICLE


    La requête complétée s'écrirait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select  ART.TITRE
        ,   ART.DATE_PUBLICATION
        ,   group_concat(MCL.MOT separator ' ') as CONCAT_MOT
    from    ARTICLE as  ART
        left join 
            MOT_CLE as  MCL
            on  MCL.ARTICLE_ID = ART.ID
    group by ART.ID
    (TITRE, DATE_PUBLICATION) étant la clé fonctionnelle de la table ARTICLE, le regroupement sur la clé primaire de cette table donnera le même résultat qu'un regroupement sur ces deux colonnes de la clause SELECT.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 392
    Points : 863
    Points
    863
    Par défaut
    merci de m'avoir démystifié et démythifié ! Parce que j'ai été mythifié aussi ! On m'avait dit qu'il n'y avait que COUNT qui était exclu de la "fausse" contrainte


    Le tuto a aussi l'avantage d'apprendre l'existence de sql_mode=ONLY_FULL_GROUP_BY !

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Pour info, la doc MySQL https://dev.mysql.com/doc/refman/8.0...-handling.html aborde ce cas :

    SELECT o.custid, c.name, MAX(o.payment)
    FROM orders AS o
    INNER JOIN customers AS c ON o.custid = c.custid
    GROUP BY o.custid;
    For the query to be legal in SQL-92, the name column must be omitted from the select list or named in the GROUP BY clause.

    SQL:1999 and later permits such nonaggregates per optional feature T301 if they are functionally dependent on GROUP BY columns: If such a relationship exists between name and custid, the query is legal. This would be the case, for example, were custid a primary key of customers.
    Le tuto a aussi l'avantage d'apprendre l'existence de sql_mode=ONLY_FULL_GROUP_BY !
    Que je conseille de toujours activer, pour des résultats fiables.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

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

Discussions similaires

  1. Importance de l'ordre des champs dans un Group by ?
    Par Noren dans le forum Langage SQL
    Réponses: 1
    Dernier message: 15/12/2007, 13h31
  2. Connaitre le nombre de ligne dans un groupe
    Par lilou77 dans le forum BIRT
    Réponses: 4
    Dernier message: 13/06/2007, 15h27
  3. Alias d'un champ dans le GROUP BY impossible ?
    Par WebPac dans le forum Oracle
    Réponses: 2
    Dernier message: 21/04/2006, 12h18
  4. Mettre un champ Blob dans un Group By
    Par WebPac dans le forum SQL
    Réponses: 1
    Dernier message: 17/08/2005, 18h03
  5. Regrouper des champs dans un GROUP BY
    Par kaiserazo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 11/07/2005, 08h43

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