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 :

Impossible de lancer un select where champ1 = val1 AND champ1 = val1


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1
    Points : 4
    Points
    4
    Par défaut Impossible de lancer un select where champ1 = val1 AND champ1 = val1
    Voici la structure de ma table :

    id nom test note
    01 paul francais 18
    02 paul math 15
    03 jean francais 12
    04 jean anglais 13
    05 paul anglais 12
    06 marc francais 12

    Je voudrais selectionner ceux :
    qui ont obtenu une note au moins égale à 11 en francais
    ET
    qui ont obtenu une note au moins égale à 12 en anglais

    Ce qui dans ce cas devrait me sortir jean et paul

    ça a l'air simple mais je n'y parviens pas :-(

    Merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Analyste-programmeur
    Inscrit en
    Décembre 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2014
    Messages : 52
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par Nino_31 Voir le message
    Voici la structure de ma table :

    id nom test note
    01 paul francais 18
    02 paul math 15
    03 jean francais 12
    04 jean anglais 13
    05 paul anglais 12
    06 marc francais 12

    Je voudrais selectionner ceux :
    qui ont obtenu une note au moins égale à 11 en francais
    ET
    qui ont obtenu une note au moins égale à 12 en anglais

    Ce qui dans ce cas devrait me sortir jean et paul

    ça a l'air simple mais je n'y parviens pas :-(

    Merci d'avance
    SELECT nom
    FROM notes
    WHERE
    (test = 'francais' AND note >= 11) OR
    (test = 'anglais' AND note >= 12)
    GROUP BY
    nom
    HAVING COUNT(*) > 1

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par bstjean Voir le message
    SELECT nom
    FROM notes
    WHERE
    (test = 'francais' AND note >= 11) OR
    (test = 'anglais' AND note >= 12)
    GROUP BY
    nom
    HAVING COUNT(*) > 1
    Cette requete ne fonctionnera que s'il n'y a qu'une et une seule note par matière : si jean obtient un 11 et un 14 en français mais n'a pas de note en anglais, alors il sera sélectionné, ce n'est pas ce qui est attendu

    On peut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT nom
    FROM   notes Main
    WHERE exists
         (select 1 from notes subq
          where subq.nom = main.nom
            and subq.test= 'francais' 
            and subq.note >= 11) 
      AND exists
         (select 1 from notes subq
          where subq.nom = main.nom
            and subq.test= 'anglais' 
            and subq.note >= 12)

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

    Qui a raison d'Escartefigue ou de Bstjean ?

    La preuve par le test :
    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
    --------------
    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 `notes`
    --------------
     
    --------------
    create table `notes` (
      `id`   int      NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `nom`  char(10) NOT NULL,
      `test` char(10) NOT NULL,
      `note` int      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into notes (`id`,`nom`,`test`,`note`) values
      (1, 'paul', 'francais', 18),
      (2, 'paul', 'math',     15),
      (3, 'jean', 'francais', 12),
      (4, 'jean', 'anglais',  13),
      (5, 'paul', 'anglais',  12),
      (6, 'marc', 'francais', 12)
    --------------
     
    --------------
    select * from notes
    --------------
     
    +----+------+----------+------+
    | id | nom  | test     | note |
    +----+------+----------+------+
    |  1 | paul | francais |   18 |
    |  2 | paul | math     |   15 |
    |  3 | jean | francais |   12 |
    |  4 | jean | anglais  |   13 |
    |  5 | paul | anglais  |   12 |
    |  6 | marc | francais |   12 |
    +----+------+----------+------+
    --------------
    SELECT *
    FROM   notes
    WHERE (test = 'francais' AND note >= 11)
    or    (test = 'anglais'  AND note >= 12)
    --------------
     
    +----+------+----------+------+
    | id | nom  | test     | note |
    +----+------+----------+------+
    |  1 | paul | francais |   18 |
    |  3 | jean | francais |   12 |
    |  4 | jean | anglais  |   13 |
    |  5 | paul | anglais  |   12 |
    |  6 | marc | francais |   12 |
    +----+------+----------+------+
    --------------
    SELECT *
    FROM   notes as main
    WHERE exists
         (select 1 from notes as subq
          where subq.nom   = main.nom
            and subq.test  = 'francais'
            and subq.note >= 11)
      AND exists
         (select 1 from notes as subq
          where subq.nom   = main.nom
            and subq.test  = 'anglais'
            and subq.note >= 12)
    --------------
     
    +----+------+----------+------+
    | id | nom  | test     | note |
    +----+------+----------+------+
    |  1 | paul | francais |   18 |
    |  2 | paul | math     |   15 |
    |  3 | jean | francais |   12 |
    |  4 | jean | anglais  |   13 |
    |  5 | paul | anglais  |   12 |
    +----+------+----------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    J'ai fait en sorte de montrer le résultat des sélections.

    On remarque que dans la sélection de Bstjean, la ligne 'marc' apparaît alors que dans la table, il n'y a pas de ligne 'anglais' qui est associée.

    La formulation par Escartefigue de la requête est plus juste car on détecte bien la présence d'une ligne 'français' et d'une ligne 'anglais pour un nom donnée.

    Et bien, c'est Escartefigue le grand gagnant !

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

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Au passage en une seule passe cela s'écrit comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT nom
    FROM   notes
    WHERE  (test = 'francais' AND note >= 11) OR
           (test = 'anglais' AND note >= 12)
    GROUP  BY nom
    HAVING COUNT(DISTINCT test) = 2;
    À condition que la colonne "test" soit unique par nom, donc la table correctement contraintes comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create table notes (
      id   int      NOT NULL PRIMARY KEY,
      nom  char(10) NOT NULL,
      test char(10) NOT NULL,
      note int      NOT NULL,
      CONSTRAINT UK_NOTES_nom_test UNIQUE (nom, test)
    )
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [MySQL] select where champ1+champ2 ?
    Par maxence64 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/05/2012, 21h03
  2. Réponses: 2
    Dernier message: 31/01/2010, 02h21
  3. [RMI] Impossible de lancer mon serveur
    Par Dahu dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 11/06/2006, 09h17
  4. question sur SELECT ...WHERE...IN
    Par danseur dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/01/2004, 15h23
  5. Select * Where {}
    Par Thomad dans le forum Langage SQL
    Réponses: 14
    Dernier message: 16/10/2003, 21h27

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