Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2011, 18h00   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 10
Points : 1
Points : 1
Par défaut Requete équivalente à "ALL(champs) IN (SELECT . . ."

Bonjour,

Voici mon problème :
Je dispose de 4 tables :
eleves : liste les eleves
competences : liste les competences à acquérir par les élève
competences_validees : liste les competences validées par un élève
exercices : liste les exercices
competences_exercices : liste les competences que traite un exercice.

Mon objectif est de sortir la liste des exercices qu'un élèves peut réaliser à partir des competences qu'il a déjà validées.
Par exemple :
exercice 1 traite des competences 1,2 et 3
exercice 2 traite des competences 1 et 4

L'élève a validé les competences 1,2,3 et 5.
La requête doit me retourner l'exercice 1 uniquement.

Voici la structure générale de ce que j'aimerai faire :
Code :
1
2
3
4
5
6
SELECT * 
FROM exercices e,competences_exercices ce 
WHERE e.id_exercice = ce.id_exercice 
  AND ALL(ce.id_competence) IN (
    SELECT id_competence 
    FROM competences_validees WHERE id_eleve='1')
Bien entendu le ALL comme cela n'existe pas, mais j'ai écris cela pour que vous compreniez ce que je cherche à faire.

Mes cours de SQL sont un peu loin dans mon esprit...et je bloque sur cette requête...
Une âme charitable accepterait-elle de m'aider ?

Merci d'avance.
to1n00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 18h12   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 280
Points : 18 280
Envoyer un message via MSN à CinePhil
Citation:
Mes cours de SQL sont un peu loin dans mon esprit
Pour les cours de SQL, c'est chez SQLPro !

Notamment, les jointures s'écrivent depuis 1992 avec l'opérateur JOIN.

Citation:
liste des exercices qu'un élèves peut réaliser à partir des competences qu'il a déjà validées
Il nous faudrait la structure des tables pour pouvoir t'aider efficacement.

Essaie cette requête et dis-nous si elle répond à ton besoin :
Code :
1
2
3
4
5
SELECT -- les colonnes nécessaires et pas *
FROM exercices e
INNER JOIN competences_exercices ce ON e.id_exercice = ce.id_exercice 
    INNER JOIN competences_validees cv ON cv.id_competence = ce.id_competence
WHERE cv.id_eleve = 1
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 18h29   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 10
Points : 1
Points : 1
Salut CinePhil,

Merci pour ta réponse. Effectivement la jointure fait partie des mauvaises habitudes que j'ai prise à mon boulot. je rectifie !

Pour *, c'est simplement que je préfère mettre ça pendant l'élaboration de mes requêtes, et détaillé les champs une fois que j'ai la requête qu'il me faut

Pour la structure, la voici :

Eleves : id_eleve (varchar(15)), nom, prenom
Competences : id_competence (int), libelle_competence
competences_validees : id_eleve, id_competence
exercice : id_exercice (int), reference_exercice
competences_exercices: id_competence,id_exercice


La requête que tu me proposes me retourne les exercices traitant d'au moins une compétence que l'élève a validé... ça ne correspond donc pas à ce qu'il me faut.
to1n00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 19h18   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 280
Points : 18 280
Envoyer un message via MSN à CinePhil
Alors essaie ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT e.id_exercice
FROM exercices e
WHERE NOT EXISTS
(
    SELECT *
    FROM competences_exercices ce
    WHERE ce.id_exercice = e.id_exercice
        AND ce.id_competence NOT IN 
        (
            SELECT cv.id_competence
            FROM competences_validees cv
            WHERE cv.id_eleve = 1
        )
)
Cette requête devrait donner les exercices pour lesquels il n'existe pas de compétence non présente dans les compétences validées par l'élève 1.

Comme je dois partir, je n'ai pas le temps de voir si c'est simplifiable.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 19h25   #5
Invité de passage
 
Inscription : décembre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 10
Points : 1
Points : 1
A priori, ça semble ...... parfait !
Merci beaucoup.
to1n00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h01.


 
 
 
 
Partenaires

Hébergement Web