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 :

Aide requête champ + traduction


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Aide requête champ + traduction
    Bonsoir, aujourd'hui j'ai eu du mal à effectuer une requête et j'ai presque touché le but donc j'espère que vous aller corriger mon erreur

    Contexte :

    Dans une appli qui gère le multi-langages, je veux créer une requête qui me retourne tous mes sports :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID_SPORT, LIB_SPORT
    FROM SPORT
    Maintenant je veux "greffer" la traduction, donc avoir un LIB_SPORT qui correspond par défaut, et, si la traduction existe, la joindre à mon résultat sinon renvoyer NULL.

    J'en arrive donc à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SPORT.ID_SPORT, SPORT.LIB_SPORT, SPORT_TRAD.LIB_SPORT AS "LIB_SPORT_TRAD"
    FROM SPORT
    LEFT JOIN SPORT_TRAD ON SPORT.ID_SPORT = SPORT_TRAD.ID_SPORT
    Par exemple, si j'ai 2 sports, "Aviron" (ID = 1) qui possède une traduction en anglais, allemand et espagnol ; et "Football" (ID = 2) qui n'en possède pas, la requête me retourne ceci :

    ID_SPORT LIB_SPORT LIB_SPORT_TRAD
    1 Aviron Rowing
    1 Aviron Ruder
    1 Aviron Remo
    2 Football NULL

    Enfin, et c'est là que ça devient compliqué, je veux récupérer uniquement les traductions dans la langue du site. Comme il se peut qu'un champ ne soit pas traduit, dans ce cas là le champ utilisé est celui par défaut (LIB_SPORT) qui est en français.

    Une table LANGUE liée avec SPORT_TRAD me permet de filtrer cela. Voilà comment j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SPORT.ID_SPORT, SPORT.LIB_SPORT, SPORT_TRAD.LIB_SPORT AS "LIB_SPORT_TRAD"
    FROM SPORT
    LEFT JOIN SPORT_TRAD ON SPORT.ID_SPORT = SPORT_TRAD.ID_SPORT
    LEFT JOIN LANGUE ON SPORT_TRAD.ID_LANGUE = LANGUE.ID_LANGUE
    WHERE LANGUE.LIB_LANGUE_COURT LIKE '%FR%' OR SPORT_TRAD.ID_LANGUE IS NULL
    (FR peut bien sûr varier avec UK, DE ou ES via un paramètre)
    J'arrive à avoir ce que je veux quand la langue de traduction existe mais pas quand je reste en français.

    Ex. qui fonctionne avec 'UK' par exemple :

    ID_SPORT LIB_SPORT LIB_SPORT_TRAD LIB_LANGUE_COURT
    1 Aviron Rowing UK
    2 Fooball NULL NULL

    Ex. qui ne fonctionne pas avec FR :

    ID_SPORT LIB_SPORT LIB_SPORT_TRAD LIB_LANGUE_COURT
    2 Fooball NULL NULL

    Ce que je veux :

    ID_SPORT LIB_SPORT LIB_SPORT_TRAD LIB_LANGUE_COURT
    1 Aviron NULL NULL
    2 Fooball NULL NULL

    Voilà, je touche au but mais il manque encore une étape

    Merci d'avance pour votre aide, j'ai essayé d'être clair mais si vous avez besoin de plus d'informations demandez-moi ! (je n'ai pas le code sous les yeux, donc il se peut que mes requête soient fausses, mais globalement les relations sont là).

    Cordialement,

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Enfin trouvé ! Il ne fallait pas de LEFT JOIN pour la langue car si elle n'est pas indiqué elles sont toutes retournées, ce que je ne veux pas ; à la place il faut filtrer les résultats que me renvoie SPORT_TRAD. Je ne récupère les que les enregistrements dont il existe la langue demandée. Ainsi si aucun enregistrement n'existe, c'est bien le LEFT JOIN du SPORT qui va rester. Il fallait donc bien compléter par un Exists.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SPORT.ID_SPORT, SPORT_TRAD.ID_SPORT, SPORT.LIB_SPORT, SPORT_TRAD.LIB_SPORT AS "LIB_SPORT_TRAD", SPORT_TRAD.ID_LANGUE
    FROM SPORT
    LEFT JOIN SPORT_TRAD ON SPORT.ID_SPORT = SPORT_TRAD.ID_SPORT
    AND EXISTS(SELECT * FROM LANGUE WHERE SPORT_TRAD.ID_LANGUE = LANGUE.ID_LANGUE AND LANGUE.LIB_LANGUE_COURT LIKE '%x%')
    Si x = 'FR', SPORT_TRAD ne me retourne aucun enregistrement car il n'existe aucun champ traduit dans cette langue 'FR'. Mais comme je fais un LEFT JOIN, je garde au moins un enregistrement sur SPORT.ID_SPORT.
    Si x = 'UK', SPORT_TRAD ne me retourne un enregistrement car il existe aucun champ traduit dans cette langue 'UK'. Cette fois-ci c'est la jointure qui fait la liaison sur SPORT_TRAD.ID_SPORT.
    Dans tous les cas, j'ai bien mon sport qui n'a aucune traduction.

    L'avantage en plus de ça c'est que je gagne en souplesse, je peux remplir ma table LANGUE de pleins d'autres langues par avance et sans conflit.

    Quel soulagement, j'espère que ce cas particulier aidera certains !

  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

    Vous auriez aussi plus simplement pu déplacer la condition sur la langue dans la condition de jointure.
    Vous pouvez aussi utiliser COALESCE pour récupérer directement la traduction si elle existe, sinon le libellé par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
            SPORT.ID_SPORT
        ,   COALESCE(SPORT_TRAD.LIB_SPORT, SPORT.LIB_SPORT) AS "LIB_SPORT"
    FROM SPORT
    LEFT JOIN SPORT_TRAD 
                INNER JOIN LANGUE 
                    ON SPORT_TRAD.ID_LANGUE = LANGUE.ID_LANGUE
        ON SPORT.ID_SPORT = SPORT_TRAD.ID_SPORT
        AND LANGUE.LIB_LANGUE_COURT LIKE '%FR%'

Discussions similaires

  1. Aide requête de traduction
    Par mespada dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/05/2015, 11h43
  2. Aide requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 18
    Dernier message: 14/09/2006, 21h31
  3. Aide Requête SQL (UPDATE)
    Par Glowprod dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/07/2006, 14h04
  4. Résultat requête champ vide
    Par lito74 dans le forum Access
    Réponses: 3
    Dernier message: 24/05/2006, 14h50
  5. Etat basé sur requête à champs variables
    Par hmonnet dans le forum Access
    Réponses: 2
    Dernier message: 10/11/2005, 08h19

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