Requête mysql défectueuse [Résolu/Fermé]

Signaler
Messages postés
870
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2011
-
Smoking bird
Messages postés
870
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2011
-
Bonjour,

La requête suivante:

select id.ref_cat,rel.ref_bCat,id.nom,id.type,cg.outFocus
from cat_id id
inner join cat_status as st using (ref_cat)
left outer join cat_rel as rel using (ref_cat)
case when id.type='b' then inner join bCat_config
when id.type='s' then inner join sCat_config end
as cg using (ref_cat) where st.status!=0 order by rel.ref_bCat


Me renvoi l'erreur suivante:
MySQL a répondu: 
#1064 - Erreur de syntaxe près de 'case when id.type='b' then inner join bCat_config
when id.type='' à la ligne 5


Je ne comprends absolument pas pourquoi. Mon utilisation du case est peut être minable, mais la doc dessus l'est malheureusement encore plus:s et je ne trouve aucun tuto/exemple qui convienne à mon cas -_-'. Quelqu'un saurait il m'aider?

Cordialement,

Smoke

6 réponses

Messages postés
437
Date d'inscription
mercredi 29 juillet 2009
Statut
Membre
Dernière intervention
23 septembre 2010
74
Bonjour,

En effet, l'utilisation du case when est inappropriée. la syntaxe du case when exacte est:
SELECT 
    col1, 
    case 
        when col2='a' then 'on affiche coucou' 
        when col2='b' then 'on affiche bonjour' 
    else 'on affiche autre chose'
    end AS 'nom de la colonne'
FROM
    table

Dans ton cas, je pense que cette requête pourrait fonctionner:
SELECT 
    id.ref_cat,
    rel.ref_bCat,
    id.nom,
    id.type,
    CASE id.type 
        WHEN 'b' THEN bcg.outFocus
        WHEN 's' THEN scg.outFocus
        ELSE 'Erreur'
    END AS outFocus
FROM
    cat_id id
        INNER JOIN cat_status as st using (ref_cat)
        LEFT OUTER JOIN cat_rel as rel using (ref_cat)
        LEFT JOIN bCat_config bcg using (ref_cat)
        LEFT join sCat_config scg using (ref_cat)
WHERE
    st.status!=0 
ORDER BY
    rel.ref_bCat
Messages postés
870
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2011
55
Merci M@dien de ta réponse, j'ai fini par me résoudre, l'utilisation du case ici est superflue, j'ai fait une requête plus classique, même si je voulais l'utiliser ;).
Messages postés
437
Date d'inscription
mercredi 29 juillet 2009
Statut
Membre
Dernière intervention
23 septembre 2010
74
Il faut savoir également que le CASE WHEN n'est pas l'ami de PERFORMANCE ;)

Niveau performance, attention aussi au LEFT OUTER JOIN qui n'est pas la jointure la plus rapide. Il faut privilégier les simples LEFT JOIN et INNER JOIN. le RIGHT JOIN est intéressant mais déjà un peu plus long.

Bon courage pour la suite
Messages postés
870
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2011
55
okay pour le case when, c'est noté^^
Pour les performances du left outer join, j'y avais pas pensé, mais ça me semble logique. Cela dit, je prends soin de mes tables, j'optimise et j'analyse régulièrement ;)
Quant au right join, j'en suis pas encore au niveau où j'en saisi l'utilité :), mais j'me pencherais forcément un jour dessus^^

Merci pour les infos et à bientôt on CCM^^
Messages postés
437
Date d'inscription
mercredi 29 juillet 2009
Statut
Membre
Dernière intervention
23 septembre 2010
74
Le RIGHT JOIN est l'inverse du LEFT JOIN. Le RIGHT JOIN renvoie toutes les lignes de la 2ème table, même si la condition n'est pas remplie.
Messages postés
870
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
10 juillet 2011
55
intéressant^^ merci:)