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 :

Utilisation GROUP BY + ORDER BY


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut Utilisation GROUP BY + ORDER BY
    Bonjour,

    je bloque depuis deux jours sur la réalisation d'une requête.

    J'ai une table message qui contient tous les messages échangé par les Users. Cette table contient un champ Identification, qui sert à creer des conversations, ce champ est unique.

    Ce que je cherche à faire, c'est à récupérer le dernier message de chaque conversation.

    Pour ce faire, j'avais pensé faire cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *  FROM `message`  WHERE `Owner` = '12' GROUP BY `Identification` ORDER BY `id` DESC;
    Mais le ORDER BY n'est pas prit en compte et je n'ai pas le dernier enregistrement.

    Du coup, pour me faciliter la vie, je fais 2 requêtes

    Récupération des Identifications de conversation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT `Identification` FROM `messages` WHERE `Owner` = '12';
    Et boucle de récupération du dernier message de la conversation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `messages` WHERE `Identification` = 'xxxxxx' ORDER BY `id` DESC LIMIT 1;

    Je cherche donc à regrouper ces 2 requêtes ( plus un foreach) en une seul et unique.


    J'ai bien entendu essayé plusieurs solutions trouver par ci par là mais aucune ne fonctionne, ou alors je m'y suis mal pris.


    Si quelqu'un peu me donner une petite piste, je suis preneur.


    Merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    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 126
    Points : 38 508
    Points
    38 508
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Votre 1ère requête est invalide :
    - les colonnes du select et du group by doivent être cohérentes
    MySQL est très (trop) tolérant, tout autre SGBD aurait envoyé un message d'erreur

    Et pour que l'order by ait un intérêt :
    - les colonnes de l'order by doivent être des colonnes du select

    Pour répondre correctement à votre besoin, communiquez la description de vos 2 tables et un exemple de résultat attendu

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    en soit, la requête est valide, puisque le GROUP BY porte sur une clef candidate. Toutes les colonnes en sont donc fonctionnellement dépendantes.

    En revanche, on peut s'interroger sur l’intérêt du GROUP BY en question, puisque d'une part il porte justement sur une clef candidate et que d'autre part, il n'est utilisé aucune fonction d'agrégat. Il est donc parfaitement inutile.

    Enfin, pour répondre au problème, il s'agit d'une question récurrente et une recherche sur le forum devrait vous apporter toutes les réponses nécessaires.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    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 126
    Points : 38 508
    Points
    38 508
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    en soit, la requête est valide, puisque le GROUP BY porte sur une clef candidate. Toutes les colonnes en sont donc fonctionnellement dépendantes.
    Sauf que, hors MySQL, select * avec un group by n'est pas accepté, et de plus il est effectivement inutile

  5. #5
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Bonsoir,

    merci pour vos réponses et pour les infos sur les normes, toujours bon à savoir.

    J'ai fini par trouver ce dont j'avais besoin, je prenais le problème à l'envers quand je faisait ma requête imbriquée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `messages` WHERE (`Identification`, `id`) IN(SELECT `Identification`, MAX(id) FROM `messages` WHERE `Owner` = '12'  GROUP BY `Identification`)
    Bonne soirée.

  6. #6
    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 377
    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 377
    Points : 19 048
    Points
    19 048
    Par défaut
    Salut Geoffrey74.

    Votre méthode fonctionne, mais vous risquez d'avoir un problème de capacité de stockage car la sous-requête va gérer une grosse volumétrie.
    Et de plus, il n'est pas nécessaire de faire un "group by" pour ce genre de sélection :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `message`
    --------------
     
    --------------
    CREATE TABLE `message`
    ( `id`     integer unsigned NOT NULL auto_increment primary key,
      `owner`  integer unsigned NOT NULL,
      `enreg`  datetime         NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `message` (`owner`,`enreg`) values
      (12,'2016-09-20 15:44:33'), (15,'2016-09-20 15:46:12'),
      (12,'2016-09-20 15:48:17'), (15,'2016-09-20 15:50:25'),
      (12,'2016-09-20 15:52:11'), (15,'2016-09-20 15:54:53'),
      (12,'2016-09-20 15:57:26'), (15,'2016-09-20 15:59:17')
    --------------
     
    --------------
    select * from message
    --------------
     
    +----+-------+---------------------+
    | id | owner | enreg               |
    +----+-------+---------------------+
    |  1 |    12 | 2016-09-20 15:44:33 |
    |  2 |    15 | 2016-09-20 15:46:12 |
    |  3 |    12 | 2016-09-20 15:48:17 |
    |  4 |    15 | 2016-09-20 15:50:25 |
    |  5 |    12 | 2016-09-20 15:52:11 |
    |  6 |    15 | 2016-09-20 15:54:53 |
    |  7 |    12 | 2016-09-20 15:57:26 |
    |  8 |    15 | 2016-09-20 15:59:17 |
    +----+-------+---------------------+
    --------------
    select           t1.*
               from  message as t1
    left outer join  message as t2
                 on  t2.owner = t1.owner
                and  t2.enreg > t1.enreg
              where  t2.enreg is null
    --------------
     
    +----+-------+---------------------+
    | id | owner | enreg               |
    +----+-------+---------------------+
    |  7 |    12 | 2016-09-20 15:57:26 |
    |  8 |    15 | 2016-09-20 15:59:17 |
    +----+-------+---------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/10/2013, 12h09
  2. Petit problème SQL (GROUP BY|ORDER BY)
    Par kalash_jako dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/04/2007, 23h17
  3. group by - order by
    Par romstarr dans le forum Oracle
    Réponses: 14
    Dernier message: 21/02/2007, 15h02
  4. aide pour utilisation group by
    Par rlnd23 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/10/2006, 00h54
  5. [Access] Requète SQL Group By, Order By and Co
    Par zoidy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/06/2006, 14h37

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