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 :

Creation d'une requete avec plusieurs ID pointant sur une autre table


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 38
    Points
    38
    Par défaut Creation d'une requete avec plusieurs ID pointant sur une autre table
    Bonjour,
    Je suis en train de developper un petit site web pour m'aider à organiser un evenement sportif sur un WE.
    Les participants font le choix de 4 activités parmis N activites.
    Je cré un planning des activités en appliquant leurs activité demandé sur le WE (samedi matin = sam, samedi aprés midi = spm, dimanche matin = dam, dimanche aprés midi = dpm)
    J'ai une table "participants" qui contient toutes les infos du participants, mais aussi l'identifiant des 4 activités sur le WE, donc j'ai 4 clés (sam, spm, dam, dpm)
    J'ai une table "activités" qui contient toutes les infos pour chaque activités
    J'essaye de me créer une requete qui me retournera le nom du participant, et le nom de l'activité par 1/2 journée:

    SELECT
    participants.NOM, activites.NOM_ACT , activites.NOM_ACT, activites.NOM_ACT, activites.NOM_ACT
    FROM
    participants, activites
    WHERE
    activites.ID_ACT in (participants.sam, participants.spm, participants.dam, participants.dpm)

    Malheureusement, j'obtiens 4 lignes par participants, les 4 activités de chaque ligne sont identique, mais à chaque ligne l'activité est différentes
    Si je groupe par l'ID des participants : je n'ai qu'une ligne par participant, mais les 4 activités identiques

    Auriez vous une idée pour la création de ma requete?
    Merci d'avance
    Julien

    PS: je suis dans mon truc, donc pour moi cela me semble clair, n'hésitez pas à demander plus d'info.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    bonjour

    En effet, répeter le nom d'une même colonne comme vous le faites ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  participants.NOM, activites.NOM_ACT , activites.NOM_ACT, activites.NOM_ACT, activites.NOM_ACT 
    ne peut produire que le résultat que vous obtenez, à savoir 4 fois la même valeur sur chaque ligne

    De plus, votre modèle de données est incorrect, c'est pourquoi vous avez des difficultés à obtenir ce que vous souhaitez
    Vous devriez avoir
    Une table des activités (code activité, description etc...)
    Une table des participants (n°, nom, prénom etc...)
    Une table issue de la relation entre participants et activités (N° participant, code activité, date, code période (sam/spm/dam/DPM), etc...
    le code période n'a rien à faire dans la table des participants !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 38
    Points
    38
    Par défaut
    Merci pour ta réponse, en effet je dois rajouter cette table de relation.
    Si je rajoute cette table comment je dois écrire ma requête pour qu'elle me liste tous les participants et le nom de leurs activités dans l'ordre?

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Tu as besoin de fais plusieurs jointure sur les différentes clés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT participants.NOM, asam.NOM_ACT , aspm.NOM_ACT, adam.NOM_ACT, adpm.NOM_ACT
        FROM participants
            join activites asam on asam.ID_ACT = participants.sam
            join activites aspm on aspm.ID_ACT = participants.spm
            join activites adam on adam.ID_ACT = participants.dam
            join activites adpm on adpm.ID_ACT = participants.dpm;
    Si il est possible que l'une des activités ne soit pas renseigné dans la table participant, remplace join par join left.

    Cordialement,
    Patrick Kolodziejczyk.

    Edit : Le conseil de escartefigue est pertinent d'un point de vue modèle de données.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Il est à noter que cette façon de faire n'est pas spécialement adaptée.

    On le voit dans la requête de kolodz, tu dois faire 4 jointures sur la même table pour obtenir ce que tu veux. Si tu avais beaucoup de périodes, tu vois rapidement que cela ne pourrait convenir.
    Au final, tu aurais le même niveau d'information avec une seule jointure à la seule différence qu'au lieu d'une ligne par participant avec 4 activités, tu aurais 4 lignes par participants, 1 par période, chacune avec une activité.

    En bref il s'agit de cosmétique, tu demandes à ton SGBD d'afficher tes infos en colonnes car c'est plus pratique pour toi. Ce n'est pas le rôle du SGBD, il serait mieux de laisser cela à l'application appelante qui pourra le faire très facilement au moment de traiter le retour de ta requête.

    En option, une solution moche mais qui pourrais te servir en fonction de ce que tu veux faire par la suite, c'est d'utiliser GROUP_CONCAT disponible en MySQL. Ça te permettrait d'avoir toutes tes activités séparées par une virgule (ou autre) dans un seul champ de retour avec une seule jointure. Charge ensuite à l'application de séparer les activités si besoin.
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/07/2012, 19h57
  2. Réponses: 10
    Dernier message: 09/02/2010, 20h08
  3. Trier une requûete avec plusieurs UNION
    Par bobosh dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/07/2008, 16h28
  4. Creation d'une requete avec plusieurs aggrégats
    Par Franck_P dans le forum Langage SQL
    Réponses: 6
    Dernier message: 23/06/2008, 22h38
  5. Pb Count dans une requete avec plusieurs champ retournés
    Par maxos75 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/06/2008, 14h01

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