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 :

Regroupement automatique sans fonction group by


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 504
    Par défaut Regroupement automatique sans fonction group by
    Bonjour, j'ai besoin d'aide les amis SQL

    Deux table, Intervenant, Pole

    CodePole clé etrangére dans la table Intervenant réference à la table Pole

    SELECT * FROM `intervenant`

    Il se trouve que l'orsque j'utilise le moteur INNODB les information de ma table ci'dessous sont regrouper automatiquement sans utliser la focntion group by, normalement tout les informations devraient être en désordre !!!

    Nom : Capture d’écran 2025-03-08 124301.png
Affichages : 118
Taille : 59,6 Ko

    Normalement en désordre comme ci dessous (moteur ISSIAM
    Nom : Capture d’écran 2025-03-08 125249.png
Affichages : 112
Taille : 64,1 Ko


    Et lorsque j'utilise la fonction group by j'ai ce resultat

    SELECT CodePole, NumEmploye FROM `intervenant` group by CodePole;

    Nous voyons que normalement ma requete doit regrouper tout les codePole !!! ce n'est pas le cas
    Nom : Capture d’écran 2025-03-08 124653.png
Affichages : 110
Taille : 53,3 Ko

    Merci de m'éclairer de vos lumières les amis

    Bonne journée

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 745
    Par défaut
    Salut chlock62.

    Je ne comprends pas ce que vous essayez de faire.
    Si je prends dans vos exemple le couple (NumEmploye, CodePole), il n'y a pas d'erreur dans les valeurs.
    Il y a juste à l'affichage un ordre différent. Est-ce de cet ordre dont il est question ?

    Quand vous faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `intervenant`
    L'ordre d'apparition est celui conditionné par votre "primary key".
    Comme vous n'avez pas communiqué le descriptif de la table, on peut supposer que l'ordre est celui de la saisie.

    Vous redonnez le même exemple, mais basé sur le moteur "MyIsam", qui doit avoir une "primary key" différente, et je suppose basée sur la colonne "NumEmploye".

    Dans votre troisième exemple, votre requête est mal écrite en MySql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CodePole, NumEmploye FROM `intervenant` group by CodePole;
    Le "group by" doit se faire sur des colonnes, ce que vous faites, mais en dehors du "group by", vous devez indiquer une fonction de regroupement, ce qui n'est pas le cas ici dans votre exemple.

    Si vous désirez trier votre résultat, il suffit d'ajouter "order by" et le nom de la colonne. Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CodePole, min(NumEmploye) FROM `intervenant` group by CodePole order by NumEmploye;
    Or vous dites :
    Citation Envoyé par chlock62
    Nous voyons que normalement ma requete doit regrouper tout les codePole !!! ce n'est pas le cas
    Qu'est-ce que vous entendez par "regrouper tous les "Codepole" ?
    Vous ne devez pas avoir la même définition de regroupement que MySql.
    Le regroupement se fait sur la colonne "CodePole" et en ce qui concerne la colonne "NumEmploye", vous aurez un seul exemplaire, celui qui sera sélectionné par la fonction que vous utiliserez.

    Si vous désirez assembler tous les "NumEmploye" ayant le même "CodePole", il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NumEmploye, CodePole FROM `intervenant` group by NumEmploye, CodePole order by NumEmploye, CodePole;
    @+

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 504
    Par défaut
    Oui les valeurs sont regroupées sur le codepole (CLE ETRANGERE) de la table Pole sans avoir utilisé group by c'est cela qui me preocupe l'affichage devrait être comme sur la deuxième photo mais j'ai l'affichage de la première photo.
    L'ordre de la saisie c'est la deuxième photo qui est rendu Mysiam et en Innodb j'ai le rendu de la première photo dont tout est regroupé sur le codePole sans avoir utilisé group by.

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 745
    Par défaut
    Si l'ordre ne te convient pas, tu ajoutes "order by ..." en précisant les colonnes. Tu peux même préciser ASC ou DESC.
    Je ne vois pas où se trouve ton problème, si c'est réellement un problème car je pense que tu as une méconnaissance du fonctionnement d'un SGBDR.

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 356
    Par défaut
    chlock62 => tu confonds regroupement (GROUP BY) et tri (ORDER BY).
    Pour commencer, sans ORDER BY dans la requête, l'ordre d'affichage des lignes n'est pas garanti, il dépend de la stratégie choisie par le moteur pour exécuter la requête, des indexes présents...

    GROUP BY n'a pas pour vocation de changer l'ordre d'affichage, ni de mettre ensemble des lignes ayant une ou plusieurs colonnes en commun, mais de cumuler des lignes.
    Par exemple:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT CodePole, COUNT(*) 
    FROM intervenant
    group by CodePole;
    Cette requête va compter le nombre d'intervenant par "CodePole". Le résultat n'aura qu'une seule ligne par valeur de "CodePole".
    D'ailleurs cette requête est incorrecte:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT CodePole, NumEmploye 
    FROM intervenant
    GROUP BY CodePole;
    En effet toutes les colonnes de la clause SELECT qui ne font pas l'objet d'une fonction d'agrégation (SUM, AVG, MIN...) DOIVENT figurer dans la clause GROUP BY.
    MySql accepte cette requête, mais la valeur de NumEmploye sera "plus ou moins" aléatoire, et surtout n'aura aucune signification.

    ORDER BY a pour rôle de trier les lignes:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT CodePole, NumEmploye 
    FROM intervenant
    ORDER BY CodePole;
    Ici les lignes sont triées sur le CodePole, donc toutes celles qui ont la même valeur pour CodePole seront ensembles (i.e à la suite les unes des autres).

    Mais les deux sont indépendants. Il est tout à fait possible de faire un regroupement (GROUP BY) sur une colonne, mais que les lignes ne soient pas triées sur cette colonne.

    Donc pour résumer:
    • Pour TRIER des lignes: ORDER BY
    • Pour cumuler des lignes: GROUP BY



    Tatayo.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 516
    Billets dans le blog
    10
    Par défaut
    Bonjour,


    Tatayo a bien expliqué la différence entre le tri (ORDER BY) et le regroupement (GROUP BY ) et comment utiliser ce dernier.


    Concernant le titre de ce fil de discussion "regroupement automatique sans fonction group by", il faut ajouter qu'il n'y a jamais de tri ou de regroupement automatique, la seule façon d'avoir la garantie de restituer les lignes dans un ordre défini, c'est d'utiliser ORDER BY. De plus, GROUP BY n'est pas une fonction.


    À ce sujet :

    Citation Envoyé par tatayo Voir le message
    GROUP BY n'a pas pour vocation de changer l'ordre d'affichage, ni de mettre ensemble des lignes ayant une ou plusieurs colonnes en commun, mais de cumuler des lignes.
    Plus précisément, il s'agit de créer des agrégats, ce qui permet en effet de calculer des cumuls (fonction SUM()), mais aussi de compter (fonction COUNT()), d'obtenir des valeurs maximales, minimales ou moyennes (fonctions MAX(), MIN() ou AVG()) et d'opérer des restrictions sur le résultat (clause HAVING).


    Concernant ceci :

    Citation Envoyé par Artemus24 Voir le message
    Quand vous faites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `intervenant`
    L'ordre d'apparition est celui conditionné par votre "primary key".
    Comme vous n'avez pas communiqué le descriptif de la table, on peut supposer que l'ordre est celui de la saisie.
    Comme l'a justement dit Tatayo, sans clause ORDER BY, l'ordre dépend du choix de l'optimiseur, à tel point que la même requête peut restituer les lignes dans un ordre différent si ORDER BY n'est pas précisé, ne serait-ce que si l'on effectue une réorganisation des tables en jeu entre les deux exécutions. Et l'ordre de saisie et celui de la PK peuvent être différents, y compris avec une PK de type auto_increment.
    De plus, comme ici on utilise SELECT *, aucun index n'est éligible, et comme il n'y a aucune restriction WHERE, il est fort probable qu'un parcours séquentiel de la table sans passer par un index soit effectué.

    @chlock62 : voyez ICI pourquoi il ne faut pas utiliser SELECT *

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 982
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    ...
    Comme l'a justement dit Tatayo, sans clause ORDER BY, l'ordre dépend du choix de l'optimiseur
    ...
    Je dirais plutôt que, sans clause ORDER BY il n'y a aucun tri des lignes du résultat ce qui fait que les lignes peuvent apparaître dans un ordre aléatoire qui peut changer lors de n'importe quelle exécution de la requête.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 516
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Si vous désirez assembler tous les "NumEmploye" ayant le même "CodePole", il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NumEmploye, CodePole FROM `intervenant` group by NumEmploye, CodePole order by NumEmploye, CodePole;
    S'il n'y a aucun calcul d'agrégat, on utilisera la clause DISTINCT plutôt que GROUP BY, les performances seront souvent meilleures.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 504
    Par défaut
    Bonjour, je iens à vous remerciez pour votre aide.
    Effectivement j'avais pas compris tout les concepts
    Bonne continuation

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/11/2017, 18h22
  2. Réponses: 3
    Dernier message: 16/06/2016, 18h27
  3. Que retourne un GROUP BY sans fonction d'agrégation?
    Par Maniz dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/06/2012, 12h05
  4. [SQL] Regrouper des valeurs : fonction php équivalente à Group BY
    Par thibaut06 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/02/2008, 15h58
  5. Réponses: 4
    Dernier message: 05/09/2005, 12h13

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