优化子查询的最佳方法

时间:2021-05-26 12:08:04

标签: mysql sql

我需要获取signature_filesignature_datestatus_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 = ? 

1 个答案:

答案 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 = ?