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 :

Recherche sur des ensembles


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 93
    Par défaut Recherche sur des ensembles
    Bonjour,

    J'ai actuellement un souci sur une requête.
    J'ai 3 tables :
    - une composée d'élèves
    - une de compétences (anglais, math, etc...)
    - Une table de liaison N à N entre les compétences et les élèves, dans cette table se trouve un colonne avec une note de 0 à 5

    J'aurais besoin de faire des requêtes pour savoir quels sont les élèves qui ont une note supérieure à 3 dans la compétence 1 et une note supérieure à 2 dans la compétence 40.

    Je fais par exemple ce type de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    	* 
    FROM 
            competences_students
    WHERE
    	(competence_id = 1 AND level in(4,5))
    	and
    	(competence_id = 40 AND level in(3,4,5))
    ;
    Le problème de ce genre de requête c'est que Mysql la fait de façon procédural.
    Il fait d'abord la première condition et dans ces résultats fait la seconde condition.
    Si je mets un OR à la place du AND, je récupère trop de résultats.

    Est-ce que quelqu'un a une solution ?

    Merci

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    En effet, vous cherchez les lignes qui remplissent les deux conditions simultanément (ce qui restera impossible tant que 1 sera différent de 40... )

    Utilisez deux EXISTS, pour trouver les étudiants pour lesquels les deux conditions sont remplies.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 93
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    En effet, vous cherchez les lignes qui remplissent les deux conditions simultanément (ce qui restera impossible tant que 1 sera différent de 40... )

    Utilisez deux EXISTS, pour trouver les étudiants pour lesquels les deux conditions sont remplies.
    Merci de ta réponse.
    Par contre je ne connais pas du tout EXISTS, j'ai essayé 2,3 trucs mais a priori je l'utilise mal.
    Comment écrire ma requête avec ces fameux EXISTS ?

    Merci

  4. #4
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Ou sans exists :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT EleveId
    FROM   Competence_student
    WHERE  Competence_id = 1 AND Level > 3
    INTERSECT
    SELECT EleveId
    FROM   Competence_student
    WHERE  Competence_id = 40 AND Level > 2

  5. #5
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    L'intersection — qui est une conjonction (AND) — n'est pas bavarde, donc si vous préférez mettre un peu de fantaisie et du bavardage, vous pouvez coder :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT EleveId
    FROM   Competence_student AS x
    WHERE EXISTS (SELECT ''
                  FROM   Competence_student AS y
                  WHERE  x.EleveId = y.EleveId 
                    AND  Competence_id = 1 AND Level > 3) 
    AND   EXISTS (SELECT ''
                  FROM   Competence_student AS y
                  WHERE  x.EleveId = y.EleveId 
                    AND  Competence_id = 40 AND Level > 2) ;

    Vous retiendrez ce qui, par exemple, va le plus vite, consomme le moins de ressources, etc.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 93
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    L'intersection — qui est une conjonction (AND) — n'est pas bavarde, donc si vous préférez mettre un peu de fantaisie et du bavardage, vous pouvez coder :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT EleveId
    FROM   Competence_student AS x
    WHERE EXISTS (SELECT ''
                  FROM   Competence_student AS y
                  WHERE  x.EleveId = y.EleveId 
                    AND  Competence_id = 1 AND Level > 3) 
    AND   EXISTS (SELECT ''
                  FROM   Competence_student AS y
                  WHERE  x.EleveId = y.EleveId 
                    AND  Competence_id = 40 AND Level > 2) ;

    Vous retiendrez ce qui, par exemple, va le plus vite, consomme le moins de ressources, etc.
    Merci beaucoup, c'est exactement ça !

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour fsmrel,

    Il me semble que MySQL n'implémente malheureusement pas INTERSECT...

    Cela dit, il y a en effet moyen de se passer du double EXISTS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    	student_id
    FROM 
            competences_students
    WHERE
    	(competence_id = 1 AND level IN(4,5))
    	OR
    	(competence_id = 40 AND level IN(3,4,5))
    GROUP BY student_id
    HAVING COUNT(DISTINCT competence_id) = 2

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 93
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Ou sans exists :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT EleveId
    FROM   Competence_student
    WHERE  Competence_id = 1 AND Level > 3
    INTERSECT
    SELECT EleveId
    FROM   Competence_student
    WHERE  Competence_id = 40 AND Level > 2
    INTERSECT est t-il disponible sous MySql ?

  9. #9
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    N'ayant pas MySQL, je ne saurais répondre de façon objective...

    Je viens de jeter un coup d'oeil à la doc : INTERSECT n'est pas mentionné.

    De toute façon, avec aieeeuuuuu nous vous avons donné quelques solutions.

    Essayez aussi celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT EleveId
    FROM   Competence_student AS x INNER JOIN Competence_student AS y ON x.EleveId = y.EleveId  
    WHERE  x.Competence_id = 1 AND x.Level > 3
    AND    y.Competence_id = 40 AND y.Level > 2

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

Discussions similaires

  1. [Débutant] ET et OU, contraintes sur des ensembles
    Par JakeGrafton dans le forum Prolog
    Réponses: 2
    Dernier message: 27/02/2007, 11h06
  2. [Index Server] Recherche sur des caractères chinois
    Par d1g-2-d1g dans le forum Autres langages
    Réponses: 5
    Dernier message: 13/11/2006, 10h54
  3. faire une recherche sur des "
    Par richard038 dans le forum Requêtes
    Réponses: 6
    Dernier message: 24/07/2006, 22h30
  4. probleme avec des filtres de recherche sur des dates
    Par MCarole dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 10h22
  5. Recherche sur des dates
    Par jroy dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 09/02/2006, 08h27

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