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 :

GROUP BY et ORDER BY dans la même requete SQL


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 3
    Points
    3
    Par défaut GROUP BY et ORDER BY dans la même requete SQL
    Bonjour à tous,



    J'ai beau retourner le problème dans tous les sens, mais j'ai un soucis avec une requête SQL.

    J'ai une table dans laquelle sont enregistrées des annonces triées par ID, date_depot, region ...

    J'ai besoin d'avoir une liste comprenant à chaque fois la dernière annonce publiée par région.

    Par exemple :

    ID; date_depot; region

    1; 01/01/2018; A

    2; 02/01/2018; B

    3; 03/01/2018; A

    4; 04/01/2018; C

    5; 05/01/2018, B

    Je souhaite avoir comme résultats de ma requête (ID) :

    5, 4, 3

    Si je fais cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID FROM annonces GROUP BY region ORDER BY date_depot DESC
    J'obtiens :

    4, 2, 1

    Le tri s'est d'abord fait par region puis ensuite par date,. Ce qui ne me donne pas la dernière annonce par région.

    J'ai essayé de faire cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID FROM annonces ORDER BY date_depot DESC GROUP BY region
    Mais elle ne fonctionne pas, GROUP BY doit être avant le ORDER BY.



    En espérant avoir été clair, avez-vous une solution pour moi ?



    Merci beaucoup !!!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 083
    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 083
    Points : 30 840
    Points
    30 840
    Par défaut
    Il n'y a vraiment que MySQL pour laisser passer une telle requête
    C'est tout à fait normal qu'elle donne un résultat erroné, elle est construite pour ça.
    Ce que fait cette requête c'est : pour chaque région, prendre un ID et une date de dépôt au hasard (non corrélés de préférence) et trier la liste sur cette date de dépôt en commençant par la plus récente.

    Quant à la solution de ce problème elle est présente à de multiples exemplaires dans ce forum dans des requêtes du type "la dernière facture" ou "le dernier message"...
    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.

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 388
    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 388
    Points : 19 119
    Points
    19 119
    Par défaut
    Salut à tous.

    Sujet traité je ne sais combien de fois !

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`          integer unsigned NOT NULL auto_increment primary key,
      `date_depot`  date             NOT NULL,
      `region`      char(01)         NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`date_depot`,`region`) values
      ('2019-01-01', 'A'),
      ('2019-01-02', 'B'),
      ('2019-01-03', 'A'),
      ('2019-01-04', 'C'),
      ('2019-01-05', 'B')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+--------+
    | id | date_depot | region |
    +----+------------+--------+
    |  1 | 2019-01-01 | A      |
    |  2 | 2019-01-02 | B      |
    |  3 | 2019-01-03 | A      |
    |  4 | 2019-01-04 | C      |
    |  5 | 2019-01-05 | B      |
    +----+------------+--------+
    --------------
    select    *
        from  `test` as t1
       where  date_depot = (  select  max(t2.date_depot)
                              from  `test` as t2
                             where  t2.region = t1.region
                         )
    order by  t1.date_depot desc
    --------------
     
    +----+------------+--------+
    | id | date_depot | region |
    +----+------------+--------+
    |  5 | 2019-01-05 | B      |
    |  4 | 2019-01-04 | C      |
    |  3 | 2019-01-03 | A      |
    +----+------------+--------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [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
  2. 2 order by différents dans une même requete
    Par Christophe P. dans le forum SQL
    Réponses: 5
    Dernier message: 12/06/2007, 14h03
  3. plusieurs count dans la même requete
    Par lmorali dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/05/2007, 10h17
  4. [SQL2K] Deux count dans une même requete
    Par maitrebn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/02/2007, 17h12
  5. [MySQL] 2 critères de selections opposés dans 1 même requete
    Par zimotep dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/02/2006, 08h57

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