Mysql
 sql >> Base de données >  >> RDS >> Mysql

Optimisation MYSQL LEFT JOIN avec CASE

L'utilisation de l'instruction case ne rendra pas la requête plus rapide dans votre cas, mais puisque vous l'avez demandée, voici à quoi cela ressemblerait.

SELECT a.folderid, a.foldername, a.contenttype, 
    (CASE a.contenttype
        WHEN 'file' THEN b.descriptor
        WHEN 'link' THEN c.descriptor
        WHEN 'extfile' THEN d.descriptor
        WHEN 'video' THEN e.descriptor
        ELSE f.descriptor
    END CASE) AS descriptor
FROM t_folders a
LEFT JOIN t_files b ON a.contenttype = 'file' AND a.contentid = b.fileid
LEFT JOIN t_links c ON a.contenttype = 'link' AND a.contentid = c.linkid
LEFT JOIN t_extfiles d ON a.contenttype = 'extfile' AND a.contentid = d.extfileid
LEFT JOIN t_videos e ON a.contenttype = 'video' AND a.contentid = e.videoid
LEFT JOIN t_exams f ON a.contenttype = 'exam' AND a.contentid = f.examid
WHERE a.folderid = $folderId
ORDER BY a.folderid DESC

Si chacune des tables t_files, t_links, etc. a le champ folder_id, j'essaierais également de faire un UNION sur ces tables, puis de joindre à gauche le résultat avec t_folders pour obtenir le folderid et le nom du dossier.