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

 MySQL Discussion :

Requête Sélection complexe [MySQL-5.7]


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Analyste métier (Gestion de la paie) et apprentie développeur
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste métier (Gestion de la paie) et apprentie développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Par défaut Requête Sélection complexe
    Bonjour,
    J'ai une table Animal
    Je saisie la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT * 
    FROM Animal 
    WHERE date_naissance > '2009-12-31'
        OR
        ( espece='chat'
             AND
            ( sexe='M'
                OR
                ( sexe='F' AND date_naissance < '2007-06-01' )
            )
        );
    Mais dans le résultat, j'obtiens un chat de sexe féminin 'F'
    avec une date_naissance = '2010-09-13 15:02:02'
    Tous les autres résultats sont corrects.
    Auriez-vous une idée ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2016
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Mars 2016
    Messages : 58
    Par défaut
    Bonjour

    C’est certainement un problème de parenthèses. Il faut faire très attention avec les OR !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    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 669
    Billets dans le blog
    10
    Par défaut
    Le résultat est correct
    Il est du au premier critère de filtrage avant le OR qui est vérifié :

    WHERE date_naissance > '2009-12-31'.

    Avec la requête présentée un peu plus proprement, on le voit mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *
    FROM Animal
    WHERE date_naissance > '2009-12-31'
       OR (    espece='chat' 
           AND (    sexe='M' 
                OR (sexe='F' AND date_naissance < '2007-06-01' )
                )
          );
    Avec ce premier critère, tous les animaux nés à partir du 1er janvier 2010 inclus seront extraits, pas seulement les chats.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Analyste métier (Gestion de la paie) et apprentie développeur
    Inscrit en
    Août 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste métier (Gestion de la paie) et apprentie développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 2
    Par défaut Re
    Merci beaucoup pour cette explication très claire et pertinente.

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 099
    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 : 7 099
    Par défaut
    Salut à tous.

    Citation Envoyé par Christelle06
    Mais dans le résultat, j'obtiens un chat de sexe féminin 'F' avec une date_naissance = '2010-09-13 15:02:02'
    En ce qui concerne vos animaux, vous sélectionnez du plus restrictif au plus général :

    1) tous les chattes dont la date de naissance est inférieure au '2007-06-01'
    2) tous les chats qui sont mâles
    3) tous les animaux dont la date de naissance est supérieure au '2009-12-31'.

    Votre résultat se trouvez dans le cas 3). Pourquoi ?
    Car votre animal est né après le '2009-12-31'. Et comme par hasard, c'est une chatte.

    Si vous avez des problèmes pour formuler une condition complexe, utilisez le "case" comme dans mon exemple ci-après.
    Cela vous permet de savoir dans quel cas de figure vous vous trouvez.

    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `animal`
    --------------
     
    --------------
    CREATE TABLE `animal`
    ( `id`              integer  unsigned  NOT NULL auto_increment primary key,
      `date_naissance`  date               NOT NULL,
      `sexe`            char(01)           NOT NULL,
      `espece`          varchar(255)       NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `animal` (`date_naissance`,`sexe`,`espece`) VALUES
    ('2007-05-12', 'f', 'chat'),
    ('2007-05-25', 'm', 'chat'),
    ('2012-08-07', 'f', 'chien'),
    ('2009-09-06', 'm', 'lapin'),
    ('2010-09-03', 'f', 'chat')
    --------------
     
    --------------
    select * from `animal`
    --------------
     
    +----+----------------+------+--------+
    | id | date_naissance | sexe | espece |
    +----+----------------+------+--------+
    |  1 | 2007-05-12     | f    | chat   |
    |  2 | 2007-05-25     | m    | chat   |
    |  3 | 2012-08-07     | f    | chien  |
    |  4 | 2009-09-06     | m    | lapin  |
    |  5 | 2010-09-03     | f    | chat   |
    +----+----------------+------+--------+
    --------------
    select *,
           case when espece = 'chat' and sexe = 'f' and date_naissance < '2007-06-01' then 1
                when espece = 'chat' and sexe = 'm'                                   then 2
                when                                    date_naissance > '2009-12-31' then 3
                                                                                      else 4
           end as cond
     
    from animal
    --------------
     
    +----+----------------+------+--------+------+
    | id | date_naissance | sexe | espece | cond |
    +----+----------------+------+--------+------+
    |  1 | 2007-05-12     | f    | chat   |    1 |
    |  2 | 2007-05-25     | m    | chat   |    2 |
    |  3 | 2012-08-07     | f    | chien  |    3 |
    |  4 | 2009-09-06     | m    | lapin  |    4 |
    |  5 | 2010-09-03     | f    | chat   |    3 |
    +----+----------------+------+--------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

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

Discussions similaires

  1. Requête : Jointure Complexe
    Par xwawa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/03/2006, 11h10
  2. Requête sélection : recherche par nom
    Par leeloo77 dans le forum Access
    Réponses: 7
    Dernier message: 17/02/2006, 16h39
  3. Requête sql complexe
    Par new_wave dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/01/2006, 12h55
  4. Requête SQL Complexe
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 25/11/2005, 21h53
  5. Requête SQL complexe. Comment faire ....
    Par BilTCD dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/11/2004, 17h18

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