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

MySQL Discussion :

Requete avec group by et order by


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut Requete avec group by et order by
    Bonsoir,

    Je cherche depuis un petit moment une solution a mon problème, dont voici l'exposé :
    j'ai une table membres contenant les colonnes :
    • id_membres (auto-incrémenté)
    • nom
    • prenom
    • caserne


    et une autre table disponibilite contenant pour chaque membres leur disponibilité (présent ou absent) avec la date et l'heure a la quelle il ont mis a jour leur statut :
    • id_dispo (auto-incrémenté)
    • id_perso (contient l'id du membres)
    • statut_perso (absent ou présent)
    • date_perso (la date et l'heure du changement de statut)


    A présent mon problème :
    je souhaite afficher la caserne, nom, prénom et le statut le plus récent (en date) pour chaque personnes issue de la caserne de PARIS.

    ainsi j'ai crée cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT membres.caserne, membres.nom, membres.prenom, disponibilite.statut_perso, DATE_FORMAT(disponibilite.date_perso, \'%d/%m/%Y %k:%i:%s\') AS DateTemps FROM membres, disponibilite WHERE disponibilite.id_perso = membres.id_membres AND membres.caserne = 'PARIS' GROUP BY disponibilite.id_perso DESC ORDER BY DateTemps
    Or cette requête me retourne pour chaque personne le statut le plus ancien (cad: le premier statut qui existe en bdd) or je voudrais le statut le plus récent en date !

    auriez vous une idée ? j'ai beau rajouter 'DESC' dans le ORDER BY mais rien n'y change ! merci d'avance

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    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 636
    Billets dans le blog
    10
    Par défaut
    Votre groupage n'est pas cohérent avec votre select, de plus inutile de mettre la caserne dans le select, puisque vous filtrez sur Paris (le transport des données a un cout)

    Voici une méthode simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT M1.nom, 
           M1.prenom, 
           D1.statut_perso, 
           DATE_FORMAT(D1.date_perso, \'%d/%m/%Y %k:%i:%s\') AS DateTemps 
    FROM membres M1 
    inner join disponibilite D1
       On D1.id_perso = M1.id_membres 
    Where M1.caserne = 'PARIS'
      and M1.date_perso =
         (select max(date_perso)
          from disponibilite D2
          where D2.id_perso = D1.id_perso)
    ORDER BY M1.nom, M1.prenom
    J'en ai profité pour séparer le filtrage (where) de la jointure (join) et mettre en forme la requete, c'est tellement plus facile à lire

    Autre methode : utiliser une fonction de fenétrage et sélectionner le rang 1

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut
    merci escartefigue ça fonctionne a merveille, j'avoue que je n'aurais penser faire comme ca, cad faire un 'select max dans une clause where pour la date !
    et par curiosioté que veu tu dire par Autre methode : utiliser une fonction de fenétrage et sélectionner le rang 1 ?
    encore merci

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    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 636
    Billets dans le blog
    10
    Par défaut
    Je veux dire quelque chose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select * from
      (SELECT  ROW_NUMBER()                                         
                  OVER (PARTITION BY M1.nom ORDER BY datetemps desc) AS RANG
               M1.prenom, 
               D1.statut_perso, 
               DATE_FORMAT(D1.date_perso, \'%d/%m/%Y %k:%i:%s\') AS DateTemps
       FROM membres M1 
       inner join disponibilite D1
          On D1.id_perso = M1.id_membres 
       Where M1.caserne = 'PARIS'
      ) As TMP
    Where TMP.rang=1

  5. #5
    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 917
    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 917
    Par défaut
    Salut Escartefigue.

    Qu'est-ce que ce row_number() ? Ca n'existe pas en mysql.

    Si tu veux numéroter tes lignes, voici comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *, 
           @num := @num + 1 AS rang
      FROM ma_table, (SELECT @num := 0) as x;
    @+

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    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 636
    Billets dans le blog
    10
    Par défaut
    Damned !
    autant pour moi, j'oubliais que MySQL ne connait pas les fonctions de Fenêtrage, c'est fâcheux car tellement pratique voire indispensable dans certains cas !

  7. #7
    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 917
    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 917
    Par défaut
    Salut Escartefigue.

    Je compatis à ton problème.

    Mais les spécificités de chaque SGBD font que l'on ne peut pas tester quelque chose chez l'un et l'exécuter chez l'autre.
    Cela serait trop facile. Il suffirait d'apprendre un SGBD pour tous les connaitre.

    Dans le type relationnel, il y a beaucoup de choses semblables. Et il est facile de s'adapter à ce qui est similaire.
    Inversement, passer du relationnel au réseau, c'est pas exactement la même philosophie.

    J'ai remarqué à plusieurs reprises que tu as tendance à nous faire du "microsoft sql server" pour illustrer une solution "mysql".
    N'as-tu pas la possibilité de tester tes solutions dans un environnement "mysql" ?

    @+

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    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 636
    Billets dans le blog
    10
    Par défaut
    Je teste le plus souvent...
    ...mais quand je le peux, car j'interviens sur différents sites, pas tous dotés des mêmes accès et SGBD

    Du coup il arrive que je teste dans un monde et traduise mais sans pouvoir tester dans l'autre, c'est le cas ici

    De plus créer le DDL + les cas de tests n'est possible que pour les cas simples, sinon j'y passerai la journée et bon si je suis en clientèle ça le fait pas

    Par contre il m'est arrivé de répondre à 2 post simultanément et d'inverser les 2 réponses et là les tests n'y peuvent rien, peut être changer mes lunettes

  9. #9
    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 917
    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 917
    Par défaut
    Salut Escartefigue.

    Je ne fais plus de DB2 car je n'ai aucun moyen de tester ! Du coup, je laisse cela à d'autres.
    Inversement, sur mon PC, j'ai MySql et FireBird et de ce fait, je peux tester.
    C'est pourquoi, j'interviens uniquement dans ces deux forums.

    Je me demande si je ne devrais pas me mettre à faire du "microsoft sql server".
    Cela risque de ne pas plaire du tout à SQLPRO.

    J'ai du temps à revendre car j'ai les moyens de faire un DDL pour illustrer la question posée.
    Je préfère tester que répondre directement car même si je sais, je ne suis pas toujours très fiable.
    Et il m'arrive aussi de comprendre de travers une question. Alors cela n'arrange rien du tout.

    C'est un bon moyen pour se perfectionner car du temps où je faisais du DB2, je n'avais aucun accès à internet et la documentation était plutôt maigre sur ce sujet.
    J'avais toujours quelques bouquins et mon cahier pense bête à porté de mains.
    J'ai toujours procédé par test pour mes développements. Quand je ne sais pas, et bien je cherche, en faisant un exercice.
    J'ai ainsi constitué une bibliothèque d'exercices DB2 + COBOL pour tester quelques problèmes.

    @+

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

Discussions similaires

  1. Probleme requete avec group by
    Par akabou dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/01/2008, 10h28
  2. PB : Requete avec group by ?
    Par vica6a dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/11/2007, 06h53
  3. Requete avec group by
    Par rico3434 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/10/2007, 20h36
  4. [Oracle] Requête avec GROUP BY
    Par bud_gw dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/07/2006, 10h26
  5. Requete avec group by
    Par zamilou dans le forum Langage SQL
    Réponses: 6
    Dernier message: 31/03/2006, 08h37

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