Mysql
 sql >> Database >  >> RDS >> Mysql

Ottimizzazione di MYSQL LEFT JOIN con CASE

L'uso dell'istruzione case non renderà la query più veloce nel tuo caso, ma poiché l'hai richiesta, di seguito è riportato come sarebbe.

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

Se ciascuna delle tabelle t_files, t_links, ecc. ha il campo folder_id, proverei anche a fare un'UNION su queste tabelle e poi unisco il risultato a t_folders per ottenere folderid e foldername.