我需要获取signature_file、signature_date 和status_id。 每个都来自子查询,实际上,这是我的代码。
有优化此查询的最佳方法,也许只有一个子查询?
示例(预期)
SELECT
ID, fck, f1,
(SELECT f2, f3 FROM tbl2 Y WHERE Y.ID = T.fck) AS f2, f3
FROM
tbl1 T
我看的桌子总是一样...
SELECT d.*, cd.*,
( SELECT s.cnt_man_doc_signature_file
FROM cnt_man_doc_signatures s
WHERE s.cnt_man_doc_signature_document_id = d.cnt_man_doc_id
ORDER BY s.cnt_man_doc_signature_id DESC
LIMIT 1
)
AS signature_file,
( SELECT s.cnt_man_doc_signature_date
FROM cnt_man_doc_signatures s
WHERE s.cnt_man_doc_signature_document_id = d.cnt_man_doc_id
ORDER BY s.cnt_man_doc_signature_id DESC
LIMIT 1
)
AS signature_date,
( SELECT s.cnt_man_doc_signature_status_id
FROM cnt_man_doc_signatures s
WHERE s.cnt_man_doc_signature_document_id = d.cnt_man_doc_id
ORDER BY s.cnt_man_doc_signature_id DESC
LIMIT 1
)
AS status_id
FROM cnt_man_docs d
LEFT JOIN cnt_man_class_doc cd ON cd.cnt_man_class_doc_id = d.cnt_man_doc_class_id
WHERE cnt_man_doc_folder_id = ?
答案 0 :(得分:0)
正如 Marko 指出的那样:您使用了 4 个具有不同列选择的相似子查询。您可以改为只使用该子查询一次并选择所需的列:
SELECT d.*,
cd.*,
s.cnt_man_doc_signature_file,
s.snt_man_doc_signature_doc,
s.cnt_man_doc_signature_status_id
FROM cnt_man_docs d
LEFT JOIN cnt_man_class_doc cd ON cd.cnt_man_class_doc_id = d.cnt_man_doc_class_id
LEFT JOIN cnt_man_doc_signatures s ON s.cnt_man_doc_signature_document_id = d.cnt_man_doc_id
WHERE cnt_man_doc_folder_id = ?