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 :

Jointure complexe non satisfaisante


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Jointure complexe non satisfaisante
    Bonjour,

    Je cherche à faire une requête unique me retournant les résultats suivants :

    Je construit des "fiches techniques" sur des vins.

    Un vin est décrit par une liste de "champs variables", une fiche technique est composée d'une sélection de ces champs. La liste des "champs variables" étant évolutive, j'ai opté pour la structure suivante :

    Table vins : ddd_vins
    - V_NUM (clef unique)
    - V_VIN (nom du vin)
    - ...

    Table noms des champs variables : ddd_champs
    - CH_NUM (clef unique)
    - CH_RANG (ordre d’affichage)
    - CH_LIBELLE
    - ...

    Table champs variables : ddd_variable
    - VA_NUM (clef unique)
    - VA_VIN (vin : pointe sur ddd_vins.V_NUM)
    - VA_CHAMP (champ : pointe sur ddd_champs.CH_NUM)
    - VA_TEXTE (descriptif)
    - ...
    Et la composition des fiches

    Table fiche : ddd_fiches
    - F_NUM (clef unique)
    - F_TITRE (titre de la fiche)
    - F_VIN (vin : pointe sur ddd_vins.V_NUM)
    - ...

    Table champs variables utilisés pour la fiche : ddd_fiche_variable
    - FV_NUM (clef unique)
    - FV_FICHE (fiche : pointe sur ddd_fiches.F_NUM)
    - FV_CHAMP (champ : pointe sur ddd_variable.VA_NUM)
    Une fiche (ddd_fiches) comporte donc plusieurs enregistrements dans ddd_fiche_variable

    Pour construire ou modifier une fiche technique d’un vin donné, j’ai besoin :
    - de la liste complète des champs disponibles pour ce vin (table ddd_variable jointe à ddd_champs pour récupérer les intitulés et l’ordre d’affichage)
    - de savoir quels champs font déjà partie de ma fiche technique (présence d’un enregistrement associé à la fiche dans ddd_fiche_variable)

    J’ai donc construit la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM ddd_variable
    JOIN ddd_champs ON VA_CHAMP=CH_NUM 
    LEFT OUTER JOIN ddd_fiche_variable ON VA_NUM=FV_CHAMP
    WHERE VA_VIN={$ fiche['F_VIN']}
    AND (FV_FICHE={$ fiche['F_NUM']} OR FV_FICHE IS NULL)
    ORDER BY CH_RANG


    Tout marche bien lorsque je n’ai qu’une fiche technique. Mais si j’en ai construit une autre, la requête ne retourne que :
    - les champs variables associés à la fiche courante (enregistrements présents dans ddd_fiche_variable)
    - les champs variables qui ne sont associés à aucune fiche

    ex : si j’ai un champ intitulé « assemblage » sélectionné pour la fiche technique n°1, je ne le trouverai pas dans ma requête pour la fiche n°2.

    J’attends de ma requête qu’elle me retourne la liste des champs variables disponibles pour ce vin (table ddd_variable) en sachant lesquels sont sélectionnés pour ma fiche (présents dans ddd_fiche_variable)

    Merci de m’aider à finaliser cette requête, je tourne en rond depuis un bon moment.

    Cordialement,

    Antoine

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Access ?
    Bonjour,

    Que veut dire ceci dans votre requête ?

    {$ fiche['F_VIN']}
    Est ce du MS Access ? Si oui, merci de poster dans le bon forum.

    Toutes les variables affectées et affectables de la fiche N°1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM ddd_variable
    INNER JOIN ddd_champs ON ddd_variable.VA_CHAMP = ddd_champs.CH_NUM
    LEFT OUTER JOIN ddd_fiche_variable ON ddd_variable.VA_NUM = ddd_fiche_variable.FV_CHAMP
    LEFT OUTER JOIN ddd_fiches ON ddd_variable.VA_VIN = ddd_fiches.F_VIN
    WHERE ddd_fiches.F_NUM = 1 
    ORDER BY ddd_champs.CH_RANG
    PS: Il y a un bon article de SQLPro sur les méta données ici

    @+

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Désolé

    C'est du PHP

  4. #4
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Il n'y a pas mort d'homme
    Est ce que la requête fonctionne comme vous l'attendiez ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Ca ne marche pas
    Non, ça ne marche pas, j'ai tous les champs variables, mais j'ai le même résultat quelque soit la fiche

  6. #6
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Il faut paramétrer la requète avec le n° de fiche
    Bonjour,

    Toutes les variables affectées et affectables de la fiche N°1:
    @+

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut C'est ce que j'ai fait
    J'ai bien sûr paramétré en fonction de la fiche, et le résultat est le même quelque soit le n° de la fiche.

    J'ai 2 fiches

    Dans le retour de la requête pour la fiche 1, le champ "F_NUM" (table ddd_fiches) est bien à 1, mais le champ "FV_FICHE" (table ddd_fiche_variable) est à 1, 2 ou NULL, alors que je voudrais qu'il soit à 1 ou NULL

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut J'ai trouvé une solution
    J'ai trouvé une solution à partir de la requête que vous m'avez proposée.

    J'ai rajouté dans le SELECT ($enreg contient le n° de la fiche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE FV_FICHE WHEN $enreg THEN 1 ELSE 0 END AS OK_FICHE
    J'exploite ensuite OK_FICHE.

    Ce n'est peut-être pas la solution la plus élégante, mais ça marche

    Merci de votre aide

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Ca ne marche pas
    Je me suis enthousiasmé trop vite, ça me retourne trop de résultats (même sans mon rajout).

    Si un champs variable fait partie des 2 fiches, il apparaît 2 fois

  10. #10
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Oui
    Bonsoir,

    Vous pouvez ajoutez ceci à votre clause WHERE pour filtrer les variables des autres fiches

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND COALESCE(ddd_fiche_variable.fv_fiche, ddd_fiches.F_NUM) = ddd_fiches.F_NUM
    @+

Discussions similaires

  1. Requête complexe non trouvée
    Par zouheir_1 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/05/2007, 14h27
  2. Jointure si non null
    Par zulot dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/02/2007, 09h06
  3. Requête : Jointure Complexe
    Par xwawa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/03/2006, 10h10
  4. [MySQL 4.0.15] Jointure complexe
    Par Carter dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/02/2006, 14h31
  5. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02

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