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 :

Chercher une valeur max mais par groupe dans une même table


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Analyste
    Inscrit en
    Juillet 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2011
    Messages : 9
    Points : 16
    Points
    16
    Par défaut Chercher une valeur max mais par groupe dans une même table
    Bonjour,
    Mon intitulé n'est peut-être pas très clair. Je vais expliciter.
    J'ai cherché dans beaucoup de forum, mais je n'ai pas trouvé ma situation.

    J'ai une table vente, par exemple :
    Nom : tableau 1.PNG
Affichages : 125
Taille : 12,4 Ko

    Je souhaite pour chaque client récupérer les lignes correspondant à ces derniers achats. il peut donc y avoir plusieurs lignes.
    J'ai essayé avec la commande max, que ce soit dans le select ou dans le where avec un nouveau select mais à chaque fois ça me renvoie au hasard que l'une des deux lignes au lieu des deux.

    Le résultat que j'attends :
    Nom : tableau 2.PNG
Affichages : 103
Taille : 9,1 Ko

    Merci beaucoup pour votre aide !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    C'est pourtant une question qui revient TRES régulièrement.
    Il faut donc identifier la date du dernier achat de chaque personne et sélectionner dans la liste les lignes qui correspondent à ce dernier achat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  *
    FROM    matable det
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    matable sel
                WHERE   sel.nom     = det.nom
                    AND sel.prenom  = det.prenom
                HAVING  det.DATE    = MAX(sel.DATE)    
            )
    ;
    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 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut celinette2608.

    Et voici deux autres solutions, une avec une sous-requête et une autre avec jointure :
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    SET session collation_connection=latin1_general_ci
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`       integer unsigned auto_increment NOT NULL primary key,
      `nom`      varchar(255)                    NOT NULL,
      `prenom`   varchar(255)                    NOT NULL,
      `ville`    varchar(255)                    NOT NULL,
      `montant`  decimal(15,2)                   NOT NULL,
      `date`     date                            NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`nom`,`prenom`,`ville`,`montant`,`date`) VALUES
      ('Dupond', 'Louis',   'Angers',   1200.0, '2015-03-25'),
      ('Martin', 'Francis', 'Bordeaux', 2300.0, '2015-05-18'),
      ('Martin', 'Francis', 'Lyon',     1600.0, '2015-05-18'),
      ('Dupond', 'Louis',   'Cholet',    800.0, '2015-03-25'),
      ('Martin', 'Francis', 'Annecy',   4100.0, '2015-02-18'),
      ('Dupond', 'Louis',   'Tours',    1700.0, '2015-03-13')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+--------+---------+----------+---------+------------+
    | id | nom    | prenom  | ville    | montant | date       |
    +----+--------+---------+----------+---------+------------+
    |  1 | Dupond | Louis   | Angers   | 1200.00 | 2015-03-25 |
    |  2 | Martin | Francis | Bordeaux | 2300.00 | 2015-05-18 |
    |  3 | Martin | Francis | Lyon     | 1600.00 | 2015-05-18 |
    |  4 | Dupond | Louis   | Cholet   |  800.00 | 2015-03-25 |
    |  5 | Martin | Francis | Annecy   | 4100.00 | 2015-02-18 |
    |  6 | Dupond | Louis   | Tours    | 1700.00 | 2015-03-13 |
    +----+--------+---------+----------+---------+------------+
    --------------
    select *
    from test as t1
    where date = (
       select max(t2.date)
       from   test as t2
       where  t2.nom = t1.nom
       )
    --------------
     
    +----+--------+---------+----------+---------+------------+
    | id | nom    | prenom  | ville    | montant | date       |
    +----+--------+---------+----------+---------+------------+
    |  1 | Dupond | Louis   | Angers   | 1200.00 | 2015-03-25 |
    |  2 | Martin | Francis | Bordeaux | 2300.00 | 2015-05-18 |
    |  3 | Martin | Francis | Lyon     | 1600.00 | 2015-05-18 |
    |  4 | Dupond | Louis   | Cholet   |  800.00 | 2015-03-25 |
    +----+--------+---------+----------+---------+------------+
    --------------
    select t1.*
    from test as t1
    left outer join test as t2
    on  t2.nom = t1.nom
    and t2.date > t1.date
    where t2.date is null
    --------------
     
    +----+--------+---------+----------+---------+------------+
    | id | nom    | prenom  | ville    | montant | date       |
    +----+--------+---------+----------+---------+------------+
    |  1 | Dupond | Louis   | Angers   | 1200.00 | 2015-03-25 |
    |  2 | Martin | Francis | Bordeaux | 2300.00 | 2015-05-18 |
    |  3 | Martin | Francis | Lyon     | 1600.00 | 2015-05-18 |
    |  4 | Dupond | Louis   | Cholet   |  800.00 | 2015-03-25 |
    +----+--------+---------+----------+---------+------------+
    --------------
    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

  4. #4
    Membre à l'essai
    Profil pro
    Analyste
    Inscrit en
    Juillet 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2011
    Messages : 9
    Points : 16
    Points
    16
    Par défaut Merci
    Bonjour
    A Al1_24 : oui tout à fait, c'est une question qui reviens souvent mais du coup ça ne me permettait pas de garder plusieurs résultats s'il y en avait
    Merci à vous deux, je me relance dans les tests et je vous redis ça !

  5. #5
    Membre à l'essai
    Profil pro
    Analyste
    Inscrit en
    Juillet 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyste
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2011
    Messages : 9
    Points : 16
    Points
    16
    Par défaut Résolu
    Bonjour,
    J'ai utilisé la requête suivante qui m'a été proposée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select *
    from test as t1
    where date = (
       select max(t2.date)
       from   test as t2
       where  t2.nom = t1.nom
       )
    et j'ai le résultat attendu avec plusieurs lignes si égalités du champs
    Merci ! Je clos la discussion

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/11/2015, 22h15
  2. Réponses: 2
    Dernier message: 28/02/2014, 14h12
  3. [JDO] Annotations pour intégrer une relation 1-N par map dans sa join table
    Par Blustuff dans le forum Persistance des données
    Réponses: 0
    Dernier message: 31/01/2009, 13h33
  4. Réponses: 4
    Dernier message: 11/08/2008, 15h29
  5. Réponses: 2
    Dernier message: 17/06/2005, 13h38

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