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 :

Demande d'aide pour requête complexe [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Demande d'aide pour requête complexe
    Bonjour,

    Je souhaiterais effectuer une requête sur 2 tables la table A (qui contient mes données) et la table B (qui contient mes traductions).

    table A
    id id_langue_defaut texte

    table B
    id_A id_langue texte

    Je souhaiterais récupérer la liste complète des données de ma table A avec toutes les langues sous forme de colonnes. Après plusieurs tests et de brûlage de neurones, j'en arrive à une requête de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT a.*, b_fr.texte as texte_fr, b_an.texte as texte_an, b_it.texte as  texte_it, b_es.texte as texte_es 
    FROM B as b_fr 
    LEFT OUTER JOIN B b_an ON b_fr.id_A = b_an.id_A AND b_an.id_langue =2 
    LEFT OUTER JOIN B b_it ON b_fr.id_A = b_it.id_A AND b_it.id_langue =3 
    LEFT OUTER JOIN B b_es ON b_fr.id_A = b_es.id_A AND b_es.id_langue =4 
    JOIN A a ON a.id=b_fr.id_A WHERE b_fr.id_langue = a.id_langue_defaut
    Donc ça fonctionne mais ça suppose que dans A ma langue par défaut est toujours le fr.

    Question est-il possible de créer des conditions pour déterminer le nom d'un champ ? Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT A.*, 
    (
      SELECT CASE 
    --si la langue par défaut est 1 dans la table A, on utilise le champ texte de cette table
        WHEN (A.id_langue_defaut=1) 
        THEN (SELECT texte FROM A as tmp WHERE tmp.id=A.id) 
    --si la langue n'est pas 1, on essaye de chercher la traduction dans la table B
        WHEN (SELECT COUNT(id_A) FROM B as tw WHERE tw.id_A=A.id and tw.id_langue=1)
        THEN (SELECT texte FROM B as tmp WHERE tmp.id_A=A.id and tmp.id_langue=1)
    --sinon on retourne null dans texte_fr
        ELSE ("NULL")
        END
    ) as texte_fr
    FROM A
    En tout cas ceci ne fonctionne pas.

    Quelqu'un aurait des solutions ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Pas sûr d'avoir bien compris le besoin surtout autour de id_langue_defaut, au cas où, que donne cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select a.id,
           max(case when b.id_langue = a.id_langue_defaut then a.texte end) as langue_defaut,
           max(case when b.id_langue = 2 then b.texte end) as langue_an,
           max(case when b.id_langue = 3 then b.texte end) as langue_it,
           max(case when b.id_langue = 4 then b.texte end) as langue_es
      from a
      left join b on b.id_a = a.id
     group by a.id
    A savoir qu'une requête de type pivot est généralement considérée comme une requête cosmétique inutilement consommatrice de ressource, surtout avec un max sur du texte long.
    Il est probablement préférable de ne faire que la jointure externe et de gérer l'affichage dans le programme.

  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 pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT   
               A.id
      ,        MAX(CASE WHEN a.id_langue_defaut = B.id_langue THEN B.texte END) AS texte_defaut
      ,        MAX(CASE WHEN B.id_langue = 1 THEN B.texte END) AS texte_fr 
      ,        MAX(CASE WHEN B.id_langue = 2 THEN B.texte END) AS texte_an
      ,        MAX(CASE WHEN B.id_langue = 3 THEN B.texte END) AS texte_it
      ,        MAX(CASE WHEN B.id_langue = 4 THEN B.texte END) AS texte_es
    FROM A,B
    GROUP BY A.id

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses.
    En fait je suis conscient que la requête risque d'être gourmande, cependant c'est une requête qui va me permettre d'alimenter/mettre à jour un indexer pour un moteur de recherche.

    actuellement j'ai 4 num_langue (1,2,3,4) et le num_langue_defaut possède l'une des 4 valeurs

    J'ai réutilisé le modèle de requête proposée par aieeeuuuuu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT   
               A.id,A.num_langue_defaut
      ,        MAX(CASE WHEN A.num_langue_defaut = B.num_langue THEN B.titre ELSE A.titre END) AS texte_defaut
      ,        MAX(CASE WHEN B.num_langue = 1 THEN B.titre ELSE "NULL" END) AS texte_fr 
      ,        MAX(CASE WHEN B.num_langue = 2 THEN B.titre ELSE "NULL" END) AS texte_an
      ,        MAX(CASE WHEN B.num_langue = 3 THEN B.titre ELSE "NULL" END) AS texte_it
      ,        MAX(CASE WHEN B.num_langue = 4 THEN B.titre ELSE "NULL" END) AS texte_es
    FROM article A,article_multilingue B WHERE A.id=B.num_article
    GROUP BY A.id
    Résultats
    id num_langue_defaut texte_defaut texte_fr texte_an texte_it texte_es
    1 1 mon article NULL test NULL NULL

    Je me rapproche du résultat souhaité mais je devrait avoir 200 résultats avec juste un "texte_defaut" et le reste à NULL, je pourrais utiliser LEFT JOIN sur B ?

    Merci beaucoup pour votre aide

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    C'est bon mon problème est résolu, merci à vous pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT   
               A.id,A.num_langue_defaut
      ,        MAX(CASE WHEN A.num_langue_defaut = 1 THEN A.titre WHEN B.num_langue = 1 THEN B.titre ELSE "NULL" END) AS texte_fr 
      ,        MAX(CASE WHEN A.num_langue_defaut = 2 THEN A.titre WHEN B.num_langue = 2 THEN B.titre ELSE "NULL" END) AS texte_an
      ,        MAX(CASE WHEN A.num_langue_defaut = 3 THEN A.titre WHEN B.num_langue = 3 THEN B.titre ELSE "NULL" END) AS texte_it
      ,        MAX(CASE WHEN A.num_langue_defaut = 4 THEN A.titre WHEN B.num_langue = 4 THEN B.titre ELSE "NULL" END) AS texte_es
    FROM article A 
    LEFT OUTER JOIN article_multilingue B ON A.id=B.num_article
    GROUP BY A.id
    Le Traitement en 0.0019 sec. pour 20500 lignes, ça m'a l'air correct.

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

Discussions similaires

  1. Demande d'aide pour requête sqlcmd
    Par ramben dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/11/2014, 14h54
  2. demande d'aide pour requête complexe avec SUM
    Par sibia dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/04/2013, 09h09
  3. générer des donnees / aide pour requête complexe
    Par djinnwatcher dans le forum Débuter
    Réponses: 7
    Dernier message: 10/08/2009, 13h56
  4. [SQL] Demande d'aide pour requète SQL
    Par vinco888 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/01/2009, 20h04
  5. Aide pour requête complexe
    Par marivi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/09/2007, 17h27

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