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 :

Le premier de chaque lot par order by [MySQL-8.0]


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut Le premier de chaque lot par order by
    Bonjour je bloque sur cette requête ou je dois prendre le premier de chaque je dois répéter pour lvl 0 à 20

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (SELECT u.username,t.monrecord,t.classe,t.lvl FROM tbldefi AS t INNER JOIN user AS u ON(t.user_id=u.user_id) WHERE t.classe='604' AND t.iddef = 2 AND t.lvl=0 ORDER BY t.monrecord ASC LIMIT 1)
    UNION
    (SELECT u.username,t.monrecord,t.classe,t.lvl FROM tbldefi AS t INNER JOIN user AS u ON(t.user_id=u.user_id) WHERE t.classe='604' AND t.iddef = 2 AND t.lvl=1 ORDER BY t.monrecord ASC LIMIT 1)
    UNION
    (SELECT u.username,t.monrecord,t.classe,t.lvl FROM tbldef AS t INNER JOIN user AS u ON(t.user_id=u.user_id) WHERE t.classe='604' AND t.iddefi = 2 AND t.lvl=2 ORDER BY t.monrecord ASC LIMIT 1)
    ...
    Je cherche a faire plus court mais ça ne marche pas (la liaison est cassée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT u.username,min(t.monrecord),t.classe,t.lvl FROM tbldefi AS t INNER JOIN user AS u ON(t.user_id=u.user_id) WHERE t.classe='604' AND t.iddefi = 2 GROUP BY t.lvl ASC
    Vous avez une idée une requête moins répétitif ? (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 789
    Points
    30 789
    Par défaut
    Bonjour ,

    C'est un problème classique en SQL, déjà résolu de nombreuses fois sur ce forum.
    Un billet de blog lui a même été consacré : Sélectionner la ligne la plus récente pour un critère.

    Ici, ce n'est pas la date qui est utilisée pour identifier la ligne à retenir mais le principe est le même.
    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
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Bonjour, je n'arrive pas à comprendre, les exemples du lien me semblent peu parlant et complexe à suivre

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

    Pouvez-vous communiquer un exemple de contenu des tables (une dizaine de lignes suffit) et un exemple de résultat attendu.

  5. #5
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    350
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 350
    Points : 1 444
    Points
    1 444
    Par défaut
    Bonjour,
    Tu peux essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT u.username,t.classe,t.lvl, 
    (SELECT min(t2.monrecord) FROM tbldefi AS t2 WHERE t2.classe='604' AND t2.iddefi = 2 AND t.lvl=t2.lvl)  
    FROM tbldefi AS t INNER JOIN user AS u ON(t.user_id=u.user_id) 
    WHERE t.classe='604' AND t.iddefi = 2 GROUP BY t.lvl ASC

  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 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 055
    Points
    19 055
    Par défaut
    Salut à tous.

    Code mysql : 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
    SELECT     u.username,
               t.classe,
               t.lvl,
               min(t.monrecord) as monrecord
     
          FROM tbldefi AS t
     
    INNER JOIN user    AS u
            ON t.user_id=u.user_id
     
         WHERE t.classe='604'
           AND t.iddef = 2
           AND t.lvl in (0, 1, 2)
     
      GROUP BY u.username, t.classe, t.lvl
      ORDER BY u.username, t.classe, t.lvl;

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Bonjour les deux propositions ne marchent pas.
    Je vous joins un exemple: avec la vue suivante:
    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
    SELECT u.username,t.monrecord,t.classe,t.lvl FROM tbldefi AS t INNER JOIN user AS u ON(t.user_id=u.user_id) WHERE t.iddef  = 2   AND t.`classe`='604' ORDER BY `t`.`lvl` ASC
    
    username  monrecord   classe  lvl 
    sandjana    46069           604     0
    loan           42917           604     0
    vincent      28839           604      0
    loeva         43737           604      0
    toto           29637           604      0
    sandjana    50310          604      1
    loan           87342          604      1
    vincent     36812            604      1
    loeva        53962           604       1
    sandjana  54323            604       2
    loeva        53900           604       2
    Mon but est d'avoir le meilleur (temps monrecord em ms) de chaque niveau
    toto 29637 604 0
    vincent 36812 604 1
    loeva 53900 604 2

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Au lvl 0, ce n'est pas Toto (29637), mais Vincent (28839) qui a le temps le plus court

    Avec votre jeu d'essais, la requête suivante

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select lvl 
         , username
         , monrecord
    from tbldefi as T1
    where not exists
         (select 1
          from tbldefi as S1
          where S1.lvl=T1.lvl
            and S1.monrecord<T1.monrecord
         )
    order by lvl


    Donne le bon résultat :

    lvl username monrecord
    0 vincent 28839
    1 vincent 36812
    2 loeva 53900

    Cette solution est donnée dans mon blog qui vous avait été communiqué plus haut, il suffisait de l'adapter à votre cas

  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 055
    Points
    19 055
    Par défaut
    Salut à tous.

    Ou d'une manière plus classique :
    Code mysql : 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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = "latin1_general_ci"
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `tbldefi`
    --------------
     
    --------------
    CREATE TABLE `tbldefi`
    ( `id`         integer  unsigned NOT NULL auto_increment primary key,
      `username`   varchar(255)     NOT NULL,
      `monrecord`  integer  unsigned NOT NULL,
      `classe`     smallint unsigned NOT NULL,
      `lvl`        tinyint  unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `tbldefi` (`username`,`monrecord`,`classe`,`lvl`) values
     ('sandjana', 46069, 604, 0),
     ('loan',     42917, 604, 0),
     ('vincent',  28839, 604, 0),
     ('loeva',    43737, 604, 0),
     ('toto',     29637, 604, 0),
     ('sandjana', 50310, 604, 1),
     ('loan',     87342, 604, 1),
     ('vincent',  36812, 604, 1),
     ('loeva',    53962, 604, 1),
     ('sandjana', 54323, 604, 2),
     ('loeva',    53900, 604, 2)
    --------------
     
    --------------
    select * from `tbldefi`
    --------------
     
    +----+----------+-----------+--------+-----+
    | id | username | monrecord | classe | lvl |
    +----+----------+-----------+--------+-----+
    |  1 | sandjana |     46069 |    604 |   0 |
    |  2 | loan     |     42917 |    604 |   0 |
    |  3 | vincent  |     28839 |    604 |   0 |
    |  4 | loeva    |     43737 |    604 |   0 |
    |  5 | toto     |     29637 |    604 |   0 |
    |  6 | sandjana |     50310 |    604 |   1 |
    |  7 | loan     |     87342 |    604 |   1 |
    |  8 | vincent  |     36812 |    604 |   1 |
    |  9 | loeva    |     53962 |    604 |   1 |
    | 10 | sandjana |     54323 |    604 |   2 |
    | 11 | loeva    |     53900 |    604 |   2 |
    +----+----------+-----------+--------+-----+
    --------------
    SELECT     t1.*
     
          FROM tbldefi AS t1
     
         WHERE t1.monrecord = ( SELECT min(t2.monrecord)
                                  FROM `tbldefi` as t2
                                 WHERE t2.lvl = t1.lvl
                              )
      ORDER BY t1.lvl
    --------------
     
    +----+----------+-----------+--------+-----+
    | id | username | monrecord | classe | lvl |
    +----+----------+-----------+--------+-----+
    |  3 | vincent  |     28839 |    604 |   0 |
    |  8 | vincent  |     36812 |    604 |   1 |
    | 11 | loeva    |     53900 |    604 |   2 |
    +----+----------+-----------+--------+-----+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...

    Cordialement.
    Artemus24.
    @+
    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. Colorer chaque mot par une couleur differente dans un champ de texte
    Par Mettali hedi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/01/2007, 13h20
  2. Trier les lignes de ma ReadSheet par order decroissant de ma col 2 ?
    Par antoine.dandois dans le forum Général VBA
    Réponses: 2
    Dernier message: 17/01/2007, 19h40
  3. Executer une action premier lundi chaque mois
    Par Pierren dans le forum Access
    Réponses: 1
    Dernier message: 15/01/2007, 20h07
  4. Accéder au second <td> lorsque le le premier <td> est identifié par id
    Par Invité dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 17/05/2006, 20h58
  5. où trouver ordre utilisé par order by
    Par mussara dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/09/2005, 17h35

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