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 :

2 requêtes sur la même table [MySQL-5.7]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2013
    Messages : 20
    Par défaut 2 requêtes sur la même table
    Bonjour à tous,
    Je coince sur 2 requêtes, et j'ai besoin de vos conseils.

    Ma base de données, contient 1 table.

    table : t_cotisations contient: l'année (ch_annee) et le n° de membre (ch_no_membre).

    1ere requête:
    Je souhaite récupérer l’ensemble des ch_no_membres (sans doublon) qui ont cotisé en 2021 et en 2022 (ch_annee=2021 et ch_annee = 2022 par exemple):

    T_cotisations
    ch_no_membre ch_annee
    1 2020
    2 2021
    3 2020
    1 2022
    2 2022
    3 2021
    4 2021
    4 2022
    etc....


    je souhaiterai récupérer:
    ch_no_membre
    2
    4

    2ème requête, toujours avec la même table,
    Je souhaite récupérer l’ensemble des ch_no_membres (sans doublon) de tous les membres qui ont cotisé en 2022 mais pas en 2021 :
    soit
    ch_no_membre = 1

    étant débutant, j’espère avoir été assez clair dans mes explications.
    Merci d'avance pour votre aide et vos conseils.
    cdt
    kolbyt

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

    Il y a, comme souvent en SQL, plusieurs solutions pour ces besoins

    Par exemple, pour la question 1, on peut extraire les personnes qui ont cotisé entre (between) 2021 et 2022 et dont le nombre d'années distinctes de cotisation est 2, ce qui se traduit ainsi en SQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select ch_no_membre
    from T_cotisations
    where ch_annee between 2021 and 2022
    group by ch_no_membre
    having count(distinct ch_annee)=2

    Par précaution, on compte ici les années distinctes au cas où certains membres payent en plusieurs fois leur cotisation

    Pour le deuxième exercice, on vérifiera que pour chaque membre ayant cotisé en 2022 il n'existe pas de cotisation en 2021
    En SQL, cela se traduit par une requête corrélée utilisant NOT EXISTS.
    Pour ce deuxième exercice, je vous laisse chercher dans vos cours, le but n'étant pas de faire les devoirs à votre place

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    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 900
    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
    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
    --------------
    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,
      `ch_no_membre`  integer  unsigned NOT NULL,
      `ch_annee`      smallint unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`ch_no_membre`,`ch_annee`) values
      (1, 2020),(2,2021),(3,2020),(1,2022),(2,2022),(3,2021),(4,2021),(4,2022)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------------+----------+
    | id | ch_no_membre | ch_annee |
    +----+--------------+----------+
    |  1 |            1 |     2020 |
    |  2 |            2 |     2021 |
    |  3 |            3 |     2020 |
    |  4 |            1 |     2022 |
    |  5 |            2 |     2022 |
    |  6 |            3 |     2021 |
    |  7 |            4 |     2021 |
    |  8 |            4 |     2022 |
    +----+--------------+----------+
    --------------
    select `ch_no_membre`
        from `test`
       where `ch_annee` in (2021, 2022)
    group by `ch_no_membre`
      having count(ch_annee)>1
    --------------
     
    +--------------+
    | ch_no_membre |
    +--------------+
    |            2 |
    |            4 |
    +--------------+
    --------------
    select `ch_no_membre`
        from `test` as t1
       where `ch_annee` in (2022)
         and not exists (select 1 from `test` where `ch_no_membre` = t1.`ch_no_membre` and `ch_annee` = 2021)
    --------------
     
    +--------------+
    | ch_no_membre |
    +--------------+
    |            1 |
    +--------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...

    Cordialement.
    Artemus24.
    @+

  4. #4
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2013
    Messages : 20
    Par défaut
    Bonjour

    Merci pour vos réponses toujours pertinentes et formatrices.

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

Discussions similaires

  1. Requête sur une même table
    Par findjo dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/05/2016, 09h45
  2. update avec sous requête sur la même table
    Par beyo dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2012, 14h21
  3. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 11h22
  4. Requêtes avec liaison sur la même table
    Par jessenco dans le forum Requêtes
    Réponses: 10
    Dernier message: 15/01/2007, 01h10
  5. Réponses: 1
    Dernier message: 08/09/2006, 15h56

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