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 :

Un coup de main pour ma requete


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut Un coup de main pour ma requete
    Bonsoir, je cherche la solution pour ma requête, en fait j'ai plusieurs tables,
    donc voici la première : personnels qui regroupe l'ensemble du personnel
    • id_pers (id auto-incrémenté de ma table)
    • pers_nom
    • pers_prenom
    • pers_grade (id de la table grade pour désigner le grade de la personne)


    ma seconde table grade qui regroupe l'ensemble des grades disponibles
    • id_grade (id auto-incrémenté de ma table)
    • grd_grade (le nom du grade : colonnel, capitaine ....)


    ensuite j'ai une table stages qui regroupe la liste des stage disponible pour l'ensemble du personnel :
    • id_st (id auto-incrémenté de ma table)
    • st_titre (le nom du stage)


    ensuite j'ai une table loi_stage qui définit d’après le grade les stages obligatoires :
    • id_loi (id auto-incrémenté de ma table)
    • grad (l'id de la table grade pour le quel le stage est obligatoire)
    • stag (l'id de la table stages définissant le stage)


    et enfin j'ai une table pers_stages qui regroupe les stages fait par la personne ainsi que la date de réalisation :
    • id (id auto-incrémenté de ma table)
    • sp (l'id de la personnels qui contient l'id du sp)
    • stage (l'id de la table stages qui contient le stage réalisé)
    • date (la date de réalisation)


    Alors moi je dois faire une requête qui me donne le nom des stages que la personne concerné n'a pas faite d’après sont grade :
    j'ai donc fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM stages
    WHERE stages.id_st NOT IN (SELECT stage FROM pers_stages, loi_stages WHERE loi_stages.stag = pers_stages.stage AND loi_stages.grad = 1)
    mais la j'obtient la totalité des stages même ce en dehors de sont grade qui n'ont pas était fait !
    pourriez vous me donner un tuyau ??? merci

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    un truc du genre à tester car pondu de tête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select s.st_titre
    from stages s
    inner join
    	(select ls.stag as i
    	from personnels p
    	inner join loi_stage ls on ls.grad=p.pers_grade
    	where p.nom='truc' and p.prenom='machin') t1 on t1.i=s.id_st
    where s.id_st not in
    	(select ps.stage
    	from personnels p
    	inner join pers_stage ps on ps.sp=p.id_pers
    	where p.nom='truc' and p.prenom='machin')
    et évite d'écrire des jointures sans join c'est moins lisible et pas normalisé vu qu'on ne devrait plus le faire depuis 20 ans
    le where ... not in peut se ramener à une jointure mais je l'ai plus en tête... de toute façon mysql fera pour toi...

    ça sera plus léger de faire une procédure avec 2 requêtes, ça simplifie les jointures qui utilisent personnels pour rapatrier l'id du pompier concerné... du coup tu aurais:
    Code sql : 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
    delimiter $$
    drop procedure if exists stages_a_faire_sp$$
    create procedure stages_a_faire_sp(in n varchar(64), in p varchar(64))
    begin
    	declare idsp,idgd smallint unsigned;
    	select id_pers,pers_grade into idsp,idgd from personnels where nom=n and prenom=p;
    	select s.st_titre
    	from stages s
    	inner join
    		(select stag as i
    		from loi_stage
    		where grad=idgd) t1 on t1.i=s.id_st
    	where s.id_st not in
    		(select stage as i
    		from pers_stage
    		where sp=idsp)
    end$$
    delimiter ;
     
    call stages_a_faire_sp('truc','machin');

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Par défaut
    Tip top ta première requête pondu de tête fonctionne à merveille,
    ah bon on ne doit plus utiliser le where pour une jointure depuis si longtemps ? mes cours de sql remonte à 1993 !

    en tout cas merci pour ton aide précieuse
    c'est sympa

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    c'est une écriture non normalisée qui date de l'époque où on ne parlait que de jointure théta qui spécialisait un produit de table...

    maintenant c'est plus clair et optimisé...

    la procédure fait la même chose mais évite les 2 sous-jointures et recherche dans la table personnels... ça simplifie la requête principale grandement et je pense que ça doit être plus ou aussi rapide à tester...

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Cette méthode me semble plus simple, mais je ne sais pas si c'est plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT s.st_titre
    FROM personnels p
    INNER JOIN loi_stage ls ON ls.grad=p.pers_grade
    INNER JOIN stages s ON s.id_st=ls.stag
    LEFT JOIN pers_stages ps ON ps.sp=p.id_pers AND ps.stag=ls.stag
    WHERE p.pers_nom="truc"
      AND p.pers_prenom="machin"
      AND ps.stag IS NULL

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

Discussions similaires

  1. Besoin d'un coups de main pour ma requete
    Par thomas84 dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/05/2009, 16h25
  2. coup de main pour petite fonction.
    Par Fabouney dans le forum Langage
    Réponses: 1
    Dernier message: 01/08/2005, 14h27
  3. [Plugin][V4ALL]Coup de main pour V4ALL
    Par Dart dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/03/2005, 12h06

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