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 :

Une requète imbriquée avec la clause LIMIT


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut Une requète imbriquée avec la clause LIMIT
    Bonjour !

    J'ai 2 tables :
    - la première est une table d'Artistes,
    - la seconde contient les adresses de ces Artistes, chacun pouvant détenir de 1 à N adresses.

    Shématiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TABLE t_artist  (AR)
    +----+---------------------+---------+------------+-------
    | ID | date_maj            | nom_art | prenom_art | etc...
    +----+---------------------+---------+------------+-------
    | 1  | 2018-11-01 11:09:50 | Alpha   | Alain      |
    | 2  | 2018-11-02 16:12:36 | Bravo   | Beatrice   |
    | 3  | 2018-11-03 16:12:36 | Charlie | Cherif     |
    +----+---------------------+---------+------------+-------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    TABLE t_adress (AD)
    +----+---------------------+-----------+---------------
    | ID | date_maj            | id_artist | adress
    +----+---------------------+-----------+---------------
    | 1  | 2018-12-01 17:17:12 | 1         | 1 rue Alphonse
    | 2  | 2018-12-02 11:12:31 | 2         | 2 rue Bichat
    | 3  | 2018-12-03 17:15:02 | 3         | 3 rue Carpeaux
    | 4  | 2018-12-04 17:14:50 | 3         | 4 rue Daviel
    | 5  | 2018-12-05 13:37:55 | 3         | 5 rue Estienne
    +----+---------------------+-----------+---------------
    Je veux extraire la liste des artistes AVEC leur adresse la plus récente dans la DB, autrement dit en évitant l'édition des lignes de l'Artiste 3 associées aux adresses 4 et 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    LISTE DES ARTISTES (à afficher)
    +----+---------------------+---------+------------+---------------
    | ID | date_maj            | nom_art | prenom_art | etc...
    +----+---------------------+---------+------------+---------------
    | 1  | 2018-11-01 11:09:50 | Alpha   | Alain      | 1 rue Alphonse
    | 2  | 2018-11-02 16:12:36 | Bravo   | Beatrice   | 2 rue Bichat
    | 3  | 2018-11-03 16:12:36 | Charlie | Cherif     | 3 rue Carpeaux
    +----+---------------------+---------+------------+---------------
    J'ai tenté la requète imbriquée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 	`AR`.`ID`,`AR`.`nom_art`,`AR`.`prenom_art`, `AD`.`adress` 
    FROM 	`t_artist` `AR` LEFT OUTER JOIN `t_adress` `AD` ON (`AD`.`id_artist` = `AR`.`ID`) 
    WHERE 	`AD`.`date_maj` IN (
        			SELECT `AD`.`date_maj` 
        			FROM `t_adress` 
        			WHERE (`AD`.`id_artist` = `AR`.`ID`) 
        			ORDER BY `AD`.`date_maj` DESC
        			LIMIT 1
        			)
    ORDER BY `AR`.`nom_art` DESC
    Hélas, j'obtiens l'erreur :
    #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    Je suis sur OVH en MySQL v 5.0.11 et ne vais pas en changer.
    Auriez-vous une autre approche à me conseiller du côté de la requète ?

    Merci !

  2. #2
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut puresprit.

    Citation Envoyé par puresprit
    Je suis sur OVH en MySQL v 5.0.11 et ne vais pas en changer.
    La plus ancienne version que j'ai à ma disposition est la 5.5.58 et elle sera bientôt obsolète.

    Et donc, vous n'avez rien de plus récent que cette version d'un autre âge ?

    Citation Envoyé par puresprit
    Je veux extraire la liste des artistes AVEC leur adresse la plus récente dans la DB, autrement dit en évitant l'édition des lignes de l'Artiste 3 associées aux adresses 4 et 5 :
    Ce que vous demandez ne correspond pas à la ligne la plus récente mais la plus ancienne.
    Je rappelle que nous avons trois lignes pour l'artiste 3, que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +----+---------------------+-----------+----------------+
    | ID | date_maj            | id_artist | adress         |
    +----+---------------------+-----------+----------------+
    | 3  | 2018-12-03 17:15:02 | 3         | 3 rue Carpeaux |
    | 4  | 2018-12-04 17:14:50 | 3         | 4 rue Daviel   |
    | 5  | 2018-12-05 13:37:55 | 3         | 5 rue Estienne |
    +----+---------------------+-----------+----------------+
    Si vous demandez la ligne "3 rue Carpeaux", nous avons bien "2018-12-03 17:15:02" < "2018-12-05 13:37:55".

    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
    --------------
    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 `artiste`
    --------------
     
    --------------
    CREATE TABLE `artiste`
    ( `id`          integer  unsigned NOT NULL auto_increment primary key,
      `dat_maj`     datetime          NOT NULL,
      `nom_art`     varchar(255)      NOT NULL,
      `prenom_art`  varchar(255)      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `artiste` (`dat_maj`,`nom_art`,`prenom_art`) values
      ('2018-11-01 11:09:50', 'Alpha',   'Alain'),
      ('2018-11-02 16:12:36', 'Bravo',   'Beatrice'),
      ('2018-11-03 16:12:36', 'Charlie', 'Cherif')
    --------------
     
    --------------
    select * from `artiste`
    --------------
     
    +----+---------------------+---------+------------+
    | id | dat_maj             | nom_art | prenom_art |
    +----+---------------------+---------+------------+
    |  1 | 2018-11-01 11:09:50 | Alpha   | Alain      |
    |  2 | 2018-11-02 16:12:36 | Bravo   | Beatrice   |
    |  3 | 2018-11-03 16:12:36 | Charlie | Cherif     |
    +----+---------------------+---------+------------+
    --------------
    DROP TABLE IF EXISTS `adresse`
    --------------
     
    --------------
    CREATE TABLE `adresse`
    ( `id`          integer  unsigned NOT NULL auto_increment primary key,
      `dat_maj`     datetime          NOT NULL,
      `id_artiste`  integer unsigned  NOT NULL,
      `adresse`     varchar(255)      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `adresse` (`dat_maj`,`id_artiste`,`adresse`) values
      ('2018-12-01 17:17:12', 1, '1 rue Alphonse'),
      ('2018-12-02 11:12:31', 2, '2 rue Bichat'),
      ('2018-12-03 17:15:02', 3, '3 rue Carpeaux'),
      ('2018-12-04 17:14:50', 3, '4 rue Daviel'),
      ('2018-12-05 13:37:55', 3, '5 rue Estienne')
    --------------
     
    --------------
    select * from `adresse`
    --------------
     
    +----+---------------------+------------+----------------+
    | id | dat_maj             | id_artiste | adresse        |
    +----+---------------------+------------+----------------+
    |  1 | 2018-12-01 17:17:12 |          1 | 1 rue Alphonse |
    |  2 | 2018-12-02 11:12:31 |          2 | 2 rue Bichat   |
    |  3 | 2018-12-03 17:15:02 |          3 | 3 rue Carpeaux |
    |  4 | 2018-12-04 17:14:50 |          3 | 4 rue Daviel   |
    |  5 | 2018-12-05 13:37:55 |          3 | 5 rue Estienne |
    +----+---------------------+------------+----------------+
    --------------
    select      t1.nom_art,
                t1.prenom_art,
                t2.adresse
     
          from  `artiste` as t1
     
    inner join  `adresse` as t2
            on  t2.id_artiste = t1.id
           and  t2.dat_maj = (  select  max(dat_maj)
                                  from  `adresse` as t3
                                 where  t3.id_artiste = t1.id
                             )
     
      order by  t1.nom_art, t1.prenom_art
    --------------
     
    +---------+------------+----------------+
    | nom_art | prenom_art | adresse        |
    +---------+------------+----------------+
    | Alpha   | Alain      | 1 rue Alphonse |
    | Bravo   | Beatrice   | 2 rue Bichat   |
    | Charlie | Cherif     | 5 rue Estienne |
    +---------+------------+----------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Si ce n'est pas ce que vous attendez comme résultat, vous corrigerez pas vous même le "max()" en "min()".

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

  3. #3
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Merci beaucoup pour cette réponse, qui fonctionne excellemment !
    J'ai juste eu à rajouter l'alias 't3' sur dat_maj :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    and  t2.dat_maj = (  select  max(t3.dat_maj)
                                  from  `adresse` as t3
                                 where  t3.id_artiste = t1.id
                             )
    Merci encore !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2013, 20h40
  2. Réponses: 1
    Dernier message: 04/02/2011, 09h18
  3. Clause ORDER BY dans une requête imbriquée
    Par As2piK dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/02/2008, 09h35
  4. Construction d'une requête "imbriquée" avec Oracle
    Par kyra78 dans le forum Langage SQL
    Réponses: 0
    Dernier message: 05/02/2008, 14h29
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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