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 :

GROUP BY et ORDER BY sous SQL 3.23


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut GROUP BY et ORDER BY sous SQL 3.23
    Bonjour,

    Je ne sais pas si ma version de SQL est trop vieille ou si c'est moi qui suis trop vieux, mais je viens de passer l'après-midi à tenter d'organiser l'affichage d'une requête toute bête... vainement !

    Alors je viens vous expliquer mon problème, qui doit être facile à régler, mais pour lequel je tire ma langue au chat :

    J'ai (en gros) deux champs FIL et TIMBRE dans ma table MESSAGES, et je veux afficher le dernier enregistrement saisi pour chaque FIL en classant par TIMBRE décroissant (et donc la valeur TIMBRE la plus élevée pour chaque FIL).

    J'ai fait une requête simple (SELECT * FROM messages GROUP BY fil ORDER BY timbre DESC) puis des requêtes imbriquées, des trucs dans tous les sens, mais ça ne marche pas :-(

    Mon exemple concret...

    Ma table MESSAGES :

    FIL ! TIMBRE
    1 ! 1
    1 ! 2
    1 ! 3
    2 ! 1
    2 ! 4
    3 ! 1
    3 ! 2
    3 ! 3

    Le résultat attendu :

    1 ! 3
    2 ! 4
    3 ! 3

    Au secours !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Je pense que vous vous embettez pour rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT FIL, MAX(TIMBRE) AS TIMBRE
        FROM MESSAGES
    GROUP BY FIL
    ORDER BY FIL ASC;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Bien tenté... mais ça ne marche pas :-(

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Voici un petit script (SQL Server) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    declare @MESSAGES table
    (
       FIL    tinyint,
       TIMBRE tinyint
    );
     
    insert into @MESSAGES (FIL, TIMBRE)
    select 1, 1 union all
    select 1, 2 union all
    select 1, 3 union all
    select 2, 1 union all
    select 2, 4 union all
    select 3, 1 union all
    select 3, 2 union all
    select 3, 3;
     
      SELECT FIL, MAX(TIMBRE) AS TIMBRE
        FROM @MESSAGES
    GROUP BY FIL
    ORDER BY FIL ASC;
     
     
    FIL  TIMBRE
    ---- ------
    1    3
    2    4
    3    3
    Donc ça marche !

    Maintenant si vous voulez éviter le dialogue de sourd, si vous commenciez par dire ce qui ne marche pas ?
    La requête, les résultats ?

    Si c'est le deuxième cas, est-il possible de publier un jeu d'essai réel ou proche de la réalité ?

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 037
    Points : 23 784
    Points
    23 784
    Par défaut
    Bonjour,

    Essaie en t'inspirant de l'exemple donné ici : http://mysql.developpez.com/sources/...-par-categorie.
    C'est du SQL tout ce qu'il y a de plus standard, donc ça doit marcher, même pour une version 3.23 (et oui, c'est plus tout jeune ).
    Dans ton cas, n = 1 .

    ced

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Ma table exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE messagerie (
      id int(9) NOT NULL auto_increment,
      timbre timestamp(12) NOT NULL default '',
      fil int(9) NOT NULL default '0',
      ref_msg int(9) NOT NULL default '0',
      nom varchar(50) NOT NULL default '',
      exp varchar(10) NOT NULL default '',
      exp_email varchar(50) NOT NULL default '',
      dest varchar(10) NOT NULL default '',
      dest_email varchar(50) NOT NULL default '',
      msg text NOT NULL,
      lu varchar(10) NOT NULL default '',
      online tinyint(1) NOT NULL default '1',
      PRIMARY KEY  (id)
    ) TYPE=MyISAM;
    Ma requête actuelle (après une 20aine d'autres essais infructueux), simple mais inefficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id,fil,timbre,nom,exp,exp_email,msg,id FROM messagerie WHERE online=1 ORDER BY timbre DESC
    Ensuite j'utilise un WHILE pour faire défiler toutes les valeurs de FIL...

    Le résultat actuel affiche la première valeur de TIMBRE (donc la plus petite) associée à chaque FIL, alors que je voudrais le contraire : la dernière valeur TIMBRE (la plus élevée).

    Je ne sais pas si je m'exprime correctement... mais je ne vois pas comment faire mieux ;-)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    En fait je viens de comprendre quelque chose : effectivement le timbre affiché est bien le plus élevé, mais je souhaite que la ligne entière dont le TIMBRE est le plus élevé s'affiche pour chaque FIL distinct...
    Donc si vous regardez ma table, je voudrais que pour chaque FIL, les champs MSG, EXP, etc. correspondant à la ligne du TIMBRE le plus élevé s'affichent.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Essayez celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT msg.id, msg.fil, msg.timbre, msg.nom, msg.exp, msg.exp_email, msg.msg
      FROM messagerie as msg
           INNER JOIN (  select fil, max(timbre) as max_timbre
                           from messagerie
                          where online = 1
                       group by fil ) as mtm
             on mtm.fil        = msg.fil
            and mtm.max_timbre = msg.timbre
     WHERE msg.online = 1;

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    J'ai placé votre requête, mais "invalid SQL result..." :-(
    En tâtonnant rapidement, le problème se situe dans le INNER JOIN... je cherche l'erreur, mais si vous êtes plus rapide que moi...

    Sinon je peux vous créer un accès SQL à ma base afin de tester en direct...

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Sauf erreur de ma part, il me semble que les sous-requêtes ne sont pas possibles en MySQL 3.x.

    Il faudrait peut-être créer une table temporaire avec la sous requếte et ensuite faire la jointure avec cette table temporaire dans la requête principale.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Cela ne m'étonnerait pas que le problème vienne de ma vieille version de MySQL
    Tout pourrait être simple... mais non.

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ne peux-tu pas mettre à jour MySQL ?
    Avec toutes les précautions d'usage (sauvegarde notamment) qui s'imposent bien entendu.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Je ne m'y connais pas assez (même si je loue un énorme serveur dédié chez OVH) et je pense que je vais plutôt ruser pour contourner le problème, comme il faut faire si souvent...

  14. #14
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 037
    Points : 23 784
    Points
    23 784
    Par défaut
    Arf ! J'avais oublié ce détail. Pas de sous-requêtes avant la version 4.1 .
    La solution consiste alors à placer les éventuelles sous-requêtes dans des tables temporaires.

    ced

Discussions similaires

  1. Médiane avec un order by sous SQL
    Par ueshiba dans le forum SQL
    Réponses: 3
    Dernier message: 25/04/2012, 10h34
  2. Réponses: 8
    Dernier message: 12/03/2012, 09h38
  3. [SQL] group by et order by dans la même requête ?
    Par thomfort dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/08/2007, 22h31
  4. Création d'une vue sous SQL Server - group by complexe
    Par csembeil dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/01/2006, 16h17
  5. [SQL] Jointure,Group BY et ORDER BY COUNT qui marche pas
    Par Stef784ever dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/08/2005, 12h28

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