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

Langage SQL Discussion :

Probleme de regroupement par GROUP BY en sélectionnant la valeur MAX d'un champ


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut Probleme de regroupement par GROUP BY en sélectionnant la valeur MAX d'un champ
    Bonjour à tous,
    Je dispose d'une table contenant les abonnements de chaque client. Chaque client dispose de plusieurs abonnements se succédant dans le temps. Je souhaiterai récupérer l'abonnement le plus récent de chaque client.

    J'exécute la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COD_CLIENT,NOM_CLIENT,COD_ABO,NB_PANIER,DAT_1_LIVR, MAX(DAT_FIN_LIVR) AS DAT_FIN_LIVR 
    FROM `t abonnement` 
    GROUP BY COD_CLIENT
    J'obtiens alors bien la date la plus récente (celle de la ligne orange sur l'image jointe), mais les autres champs récupérés ne sont pas ceux du même enregistrement mais ceux de la ligne en vert sur l'image jointe.
    Comment récupérer les autres champs de la même ligne que la date la plus récente?
    Merci de votre aide,
    Images attachées Images attachées  

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Pour trouver la bonne ligne, il faut que tu trouves avant la date max => Select imbriqué.

    Essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t1.cod_client, t1.NOM_CLIENT, t1.COD_ABO, t1.NB_PANIER, t1.DAT_1_LIVR, t1.dat_fin_livr
    FROM t abonnement t1
    WHERE t1.dat_fin_livr = (SELECT MAX(t2.dat_fin_livr) FROM t_abonnement t2
                             WHERE t2.cod_client = t1.cod_client
                             GROUP BY t2.cod_client)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    J'avais déjà essayé cette solution mais cette requête fait planter le serveur MySql. La page ne s'arrête pas de charger et on est obligé de redémarrer le serveur car après l'arrêt manuel du chargement de la page, plus aucune requête ne s'exécute (même un simple SELECT *)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Je suppose que tu es sur une base MySQL. Je ne suis pas spécialiste du SQL sur ce genre de base mais normalement la requête que tu as indiquée devrait planter.

    Ceci étant dit, elle a l'air de t'indiquer la date max que tu souhaites et les autres informations de la première ligne renvoyée. As-tu tenté de "feinter" en t'arrangeant pour que la première ligne soit celle que tu souhaites, c'est-à-dire en plaçant un ORDER BY COD_CLIENT, DAT_FIN_LIVR desc ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Oui j'ai pensé à la même "feinte" , malheureusement ça ne fonctionne pas!
    En effet dans ma requête la date max est bien retournée mais les autres champs ne correspondent à l'enregistrement d'où la date max a été récupérée.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La requête de Kazzin est bonne est il ne faut pas essayer de feinter.
    Il vaut mieux indexer correctement la table pour améliorer grandement les performances et éviter le plantage du serveur.
    Quel volume de données à traiter ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    La table est une exportation d'une ancienne base de données access dont je dois récupérer les données pour les insérer dans un nouvel outil sous MySQL.
    Je ne peux donc pas la modifier.
    La table contient 14 127 enregistrements et je voudrais en récupérer environ 4600 (un abonnement par client et il y a 4600 clients)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Si c'est pour du one-shot, autant ne pas s'embêter à faire dans l'esthétique :

    Fais une requête qui te liste tous tes clients avec leur date max. Et ensuite fais une boucle sur chacun de tes clients pour récupérer les informations complémentaires avec la date max et les insérer dans la nouvelle table

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    14 127 lignes, c'est ridiculement petit pour une BDD MySQL. Il doit donc y avoir un problème d'index.
    Comment est indexée la table ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Effectivement, une FK aussi importante devrait être indexée...

    Par contre, sérieusement, même sans index, c'est quand même honteux que ça plante le serveur pour si peu de lignes ! (Enfin j'ose espérer que MySQL sait faire des SORT - MERGE JOINs)

    Tu dois vraiment avoir un problème de config...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. [MySQL] ID par groupe ne contenant pas certaines valeurs
    Par omdafer dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 16/02/2015, 20h17
  2. [AC-2003] Sélectionner la valeur maxi d'un champ
    Par jeanpierre78 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2012, 13h19
  3. regrouper par groupe de valeur
    Par papilou86 dans le forum IHM
    Réponses: 2
    Dernier message: 23/01/2008, 21h16
  4. Valeur Max d'un champ par défaut
    Par popoliline dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 18h30

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