Sử dụng câu lệnh trường hợp sẽ không làm cho truy vấn nhanh hơn trong trường hợp của bạn, nhưng vì bạn đã yêu cầu nó, dưới đây là cách nó trông như thế nào.
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
Nếu mỗi bảng t_files, t_links, v.v. có trường folder_id, tôi cũng sẽ thử thực hiện một UNION trên các bảng này và sau đó kết hợp lại kết quả với t_folders để lấy nếp gấp và tên thư mục.