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 :

Récupérer les 3 dernières ventes de chaque article [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Récupérer les 3 dernières ventes de chaque article
    Bonjour.

    Je souhaite extraire les 3 dernières ventes de chaque article dans la table suivante :

    article dernière commande

    art11 05/01/21
    art11 06/07/21
    art11 15/03/21
    art11 11/04/21
    art11 17/05/21
    art11 21/03/21
    art22 02/03/21
    art22 07/01/21
    art22 21/06/21
    art22 02/04/21
    art22 02/07/21
    art22 19/06/21
    art33 02/07/21
    art33 29/01/21
    art33 23/06/21
    art33 12/04/21
    art33 05/07/21
    art33 16/04/21
    art33 03/03/21
    art44 05/01/21
    art44 09/04/21
    art44 05/06/21
    art44 14/05/21
    art44 06/07/21
    art44 05/01/21
    art44 06/02/21

    Au premier abord, ça parait simple, mais tous mes tests se sont révélés non concluants ! et mes recherches sur le net ne m'ont mis sur aucune piste.

    Afin d'éviter des propositions de requêtes inutiles, sachez que le résultat doit comporter 12 enregistrements (et pas 3 ).

    Un grand merci d'avance.

  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 786
    Points
    30 786
    Par défaut
    Bonjour,

    Pour pouvoir te répondre efficacement, il faudrait que tu précises quelle version de MariaDB tu utilises.
    En effet, suivant que les fonctions de regroupement fenêtrées sont disponibles ou non, la réponse sera plus ou moins complexe.
    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
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    C'est une base de données MariaDB 10 installée sur sur un syno / phpMyAdmin.

  4. #4
    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 786
    Points
    30 786
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH    lst
        AS  (   SELECT  article
                    ,   datecommande
                    ,   RANK() OVER (PARTITION BY article ORDER BY datecommande DESC) AS ordre
                FROM    matable
            )
    SELECT  article
        ,   datecommande
    FROM    lst
    WHERE   ordre <= 3
    ORDER BY article
        ,   datecommande
    A tester, je n'ai pas de serveur MariaDB sous la main
    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.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ouah ! Alors là, ça dépasse franchement mes petites requêtes avec jointures, LIMIT, GROUP BY et compagnie !
    Je la teste dans la soirée et essaierais de la comprendre ensuite.
    Je te tiens informé.
    Merci pour ta réponse.

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Félicitations al1_24.

    Ca fonctionne du premier coup. Et j'ai compris le fonctionnement.
    Créer une table temporaire, je connaissais, mais ajouter un numéro d'ordre à chaque enregistrement puis effectuer un filtre dessus, là c'est subtile. On sens l'expérience.
    Bon, je ne connaissais ni RANK OVER ni PARTITION, alors ça n'aide pas non plus .

    Un grand grand

    J'espère que ta solution servira à d'autres.

  7. #7
    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 786
    Points
    30 786
    Par défaut
    Je t'encourage à regarder aussi les fonctions DENSE_RANK et ROW_NUMBER qui font la même chose mais avec quelques subtilités et, en général, toutes les fonctions de regroupement fenêtrées.
    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.

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton dernier conseil que je vais suivre sans faute. Bien cordialement.

  9. #9
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    Sans passer par le "common table expression" (CTE).
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    --------------
    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,
      `article`   char(05)         NOT NULL,
      `date`      date             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`article`,`date`) values
       ('art11', '2021-01-05'),
       ('art11', '2021-07-06'),
       ('art11', '2021-03-15'),
       ('art11', '2021-04-11'),
       ('art11', '2021-05-17'),
       ('art11', '2021-03-21'),
       ('art22', '2021-03-02'),
       ('art22', '2021-01-07'),
       ('art22', '2021-06-21'),
       ('art22', '2021-04-02'),
       ('art22', '2021-07-02'),
       ('art22', '2021-06-19'),
       ('art33', '2021-07-02'),
       ('art33', '2021-01-29'),
       ('art33', '2021-06-23'),
       ('art33', '2021-04-12'),
       ('art33', '2021-07-05'),
       ('art33', '2021-04-16'),
       ('art33', '2021-03-03'),
       ('art44', '2021-01-05'),
       ('art44', '2021-04-09'),
       ('art44', '2021-06-05'),
       ('art44', '2021-05-14'),
       ('art44', '2021-07-06'),
       ('art44', '2021-01-05'),
       ('art44', '2021-02-06')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------+------------+
    | id | article | date       |
    +----+---------+------------+
    |  1 | art11   | 2021-01-05 |
    |  2 | art11   | 2021-07-06 |
    |  3 | art11   | 2021-03-15 |
    |  4 | art11   | 2021-04-11 |
    |  5 | art11   | 2021-05-17 |
    |  6 | art11   | 2021-03-21 |
    |  7 | art22   | 2021-03-02 |
    |  8 | art22   | 2021-01-07 |
    |  9 | art22   | 2021-06-21 |
    | 10 | art22   | 2021-04-02 |
    | 11 | art22   | 2021-07-02 |
    | 12 | art22   | 2021-06-19 |
    | 13 | art33   | 2021-07-02 |
    | 14 | art33   | 2021-01-29 |
    | 15 | art33   | 2021-06-23 |
    | 16 | art33   | 2021-04-12 |
    | 17 | art33   | 2021-07-05 |
    | 18 | art33   | 2021-04-16 |
    | 19 | art33   | 2021-03-03 |
    | 20 | art44   | 2021-01-05 |
    | 21 | art44   | 2021-04-09 |
    | 22 | art44   | 2021-06-05 |
    | 23 | art44   | 2021-05-14 |
    | 24 | art44   | 2021-07-06 |
    | 25 | art44   | 2021-01-05 |
    | 26 | art44   | 2021-02-06 |
    +----+---------+------------+
    --------------
    select article,
           date
     
      from (          select   t1.article,
                               t1.date,
                               count(t1.date) as rang
     
                        from `test` as t1
     
             left outer join `test` as t2
                          on t2.article   = t1.article
                         and t2.date     >= t1.date
     
                    group by t1.article,t1.date
                    order by t1.article,t1.date
           ) as x
     
     where rang <=3
    --------------
     
    +---------+------------+
    | article | date       |
    +---------+------------+
    | art11   | 2021-04-11 |
    | art11   | 2021-05-17 |
    | art11   | 2021-07-06 |
    | art22   | 2021-06-19 |
    | art22   | 2021-06-21 |
    | art22   | 2021-07-02 |
    | art33   | 2021-06-23 |
    | art33   | 2021-07-02 |
    | art33   | 2021-07-05 |
    | art44   | 2021-05-14 |
    | art44   | 2021-06-05 |
    | art44   | 2021-07-06 |
    +---------+------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Il suffit d'utiliser le count() pour numéroter les lignes.

    J'espère que cela répond à votre attente.

    @+
    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écupérer les X dernières commandes de l'historiques ?
    Par Concombre Masqué dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/03/2009, 01h29
  2. Obtenir les 5 dernières ventes par article
    Par miniquick dans le forum Développement
    Réponses: 6
    Dernier message: 20/06/2008, 11h36
  3. Récupérer les X dernières lignes de mon fichier txt
    Par coincoin22 dans le forum Windows
    Réponses: 0
    Dernier message: 08/08/2007, 14h39
  4. Les 5 dernières factures de chaque vendeur
    Par Manu_Karpov dans le forum Oracle
    Réponses: 8
    Dernier message: 26/01/2007, 19h33
  5. récupèrer les n dernières heures
    Par magdalena dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 30/08/2006, 14h17

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