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

Langage SQL Discussion :

Récupérer tous les élèves d'une classe en fonction d'un élève


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut Récupérer tous les élèves d'une classe en fonction d'un élève
    Bonjour et désolé pour ce titre peu parlant, j'ai du mal à trouver les bons mots pour exposer mon probléme...
    J'ai réalisé un petit filtre de recherche sous PHP pour pouvoir afficher les informations de tous les élèves d'une même classe.
    On peut y rentrer le nom de la classe (CP A, CP B, ...), le type de classe (CP, CE1, ...) ou des informations sur un des élèves (dans le but de trouver toute sa classe).
    Dans le cas où on ne rentre que des informations sur la classe, pas de probléme, on obtient bien la liste complete des élèves. Par contre si on fais une recherche par rapport à un élève, on n'obtient que des informations sur ce dernier mais pas sur ses petits camarades.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM Classes C, Eleves E
    WHERE C.id_classe=E.id_classe
    AND nom = 'leconte';
    Dans ce cas, je ne récupére que les informations de cet élève et sa classe.
    Ce que je voudrais, c'est récupérer les informations de la classe où se trouve l'élève et de tous les élèves de cette classe.

    Est-ce que je dois faire 2 requête : une où je récupére l'id de la classe de l'élève et l'autre où je récupére toutes les infos des élèves en fonction de l'id de la classe?
    Ou existe-t-il une façon plus simple de procéder?
    Car dans le cas où je ne rentrerai que des informations sur la classe dans ma recherche, la 1ere requête serait inutile...

    Merci.

  2. #2
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    C'est possible en une seule requete, mais pour pouvoir vous répondre, il faut que vous nous communiquiez la description complète de vos tables, celle de vos index, et un exemple de données en entrée et de résultat attendu.

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Commencez par reformuler votre besoin en français clairement. Vous comprendrez pourquoi votre requete ne fonctionne pas, et comment la faire fonctionner :

    ça donnerait quelque chose comme :
    Quels sont la classe et les élèves pour lesquels la classe remplit les critères de recherche OU pour lesquels ils existe un élève de la classe remplissant les critères
    voyez donc l'opérateur EXISTS...

    Voyez aussi les jointures externes, ça vous sera surement utile...

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour et merci pour vos réponses.

    pour ce qui est de la description des tables, c'est assez simple.
    Classes : id_classe (PK), nom_classe, type_classe.
    Eleves : id_eleve (PK), nom, prenom, id_classe(FK).

    Admettons que je mette CM1-D dans le champ de recherche "nom_classe", alors j'obtiendrais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id_classe    nom_classe    type_classe      id_eleve    nom    prenom    id_classe
    5           CM1-D            CM1              2        luc      francois     5
    5           CM1-D            CM1              3        red      pierre        5        
    5           CM1-D            CM1              4        fer       laura          5
    Je voudrais obtenir le même résultat en faisant une recherche par rapport au nom de l'élève (en mettant "red" par exemple dans le champ de recherche "nom_eleve").

    Je ne connaissais pas EXISTS, ni les jointures externes d'ailleurs. Je vais me pencher dessus.

    Merci!

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Pas besoin de chercher des choses compliquées...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT e2.*
    FROM Eleves E1
    inner join Eleves E2 on e2.id_classe = e1.id_classe
    WHERE e1.nom = 'leconte';

    => Récupère tous les élèves qui sont dans la même classe que leconte.
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Effectivement, c'ets exactement ce que je cherchais.
    Juste à ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT C.*, E2.*
    FROM Eleves E1
    inner join Eleves E2 
    on E2.id_classe = E1.id_classe
    inner join Classes C
    on E1.id_classe=C.id_classe
    WHERE E1.nom = 'leconte'
    pour récupérer les info de la classe en plus.
    Si j'ai bien compris, on a la condition sur E1.nom ce qui fait que lors de la jointure, on a E2.id_classe=E1.id_classe(qui est l'id de la classe ou se trouve leconte).
    On a donc le même résultat que si on avait fait WHERE E2.id_classe=id_classe_de_leconte.

    C'est bien cela?

    En tout cas merci à vous !

  7. #7
    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 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Les critères de jointures se codent avec "INNER JOIN ON..." ou "LEFT/RIGHT/FULL OUTER JOIN ON..." depuis plus de 20 ans
    Le WHERE ne sert qu'à filtrer.

    Vous devriez vous astreindre à ne jamais utiliser select * en dehors des requêtes faites à la volée, surtout quand vous faites des jointures
    Citez les colonnes utiles à votre traitement, vous aurez un résultat stable quelque soient les évolutions des tables et un temps de traitement optimisé.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flavors Voir le message
    C'est bien cela?
    C'est bien ça
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Les critères de jointures se codent avec "INNER JOIN ON..." ou "LEFT/RIGHT/FULL OUTER JOIN ON..." depuis plus de 20 ans
    Le WHERE ne sert qu'à filtrer.

    Vous devriez vous astreindre à ne jamais utiliser select * en dehors des requêtes faites à la volée, surtout quand vous faites des jointures
    Citez les colonnes utiles à votre traitement, vous aurez un résultat stable quelque soient les évolutions des tables et un temps de traitement optimisé.
    C'est noté!

    Je me suis juste rendu compte d'un petit soucis dans le cas où deux élèves ont le même nom dans la même classe.
    Dans ce cas, on obtient pleins de doublons, mais rien qu'un SELECT DISTINCT ne puisse corriger.

    Merci à vous tous !

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CE.*
    FROM   Classes C
           JOIN Eleves E
                ON C.id_classe=E.id_classe
    	   JOIN Eleves CE
    	        ON E.id_classe = CE.id_classe
    WHERE  nom = 'leconte';
    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/ * * * * *

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Si je puis me permettre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CE.*
    FROM   Classes C
           JOIN Eleves E
                ON C.id_classe=E.id_classe
    	   JOIN Eleves CE
    	        ON E.id_classe = CE.id_classe
    WHERE  e.nom = 'leconte';
    Il manque juste le nom de la table dans la clause WHERE...

    Tatayo.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/11/2014, 19h10
  2. [RegEx] Récupérer tous les liens d'une certaine classe CSS
    Par Lost In Translation dans le forum Langage
    Réponses: 17
    Dernier message: 02/07/2009, 16h54
  3. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  4. [RegEx] récupérer tous les liens d'une page
    Par italiasky dans le forum Langage
    Réponses: 15
    Dernier message: 08/04/2006, 18h55
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

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