簡體   English   中英

查詢優化

[英]Query optimization

我對這個緩慢的查詢有疑問:

SELECT c.*, csc1.changed_status
  FROM contract c
  LEFT
  JOIN contract_status_change csc1
    ON csc1.contract_status_change_id =
        ( SELECT csc2.contract_status_change_id
            FROM contract_status_change csc2
           WHERE csc2.contract_id = c.contract_id
           ORDER
              BY csc2.date_changed DESC
           LIMIT 1
        )
 ;

我有一個合同表和一個contract_status_change表,它們記錄合同的狀態。 此查詢正在加入合同的最新狀態,因此您可以獲取其當前狀態。

請你幫我整理一下嗎?

-編輯-

我很抱歉。 我已經更新了查詢,以包括選擇實際的最新狀態。 對困惑感到抱歉!

格式化查詢以提高可讀性(一致的空格和大寫字母,刪除不必要的反引號和括號,更明智的別名)后:

SELECT c.*
  FROM contract c
  LEFT
  JOIN contract_status_change csc1
    ON csc1.contract_status_change_id =
        ( SELECT csc2.contract_status_change_id
            FROM contract_status_change csc2
           WHERE csc2.contract_id = c.contract_id
           ORDER
              BY csc2.date_changed DESC
           LIMIT 1
        )
 ;

並假定contract_status_change.contract_status_change_id是唯一標識符,我不得不得出結論,您的查詢與此等效,效率更高:

SELECT c.*
  FROM contract c
 ;

您說它“正在加入合同的最新狀態,因此您可以獲取其當前狀態”,但是它對當前狀態不執行任何操作-不按其排序,不按其篩選,不不會在查詢結果中包含它-因此沒有必要。

This should help a bit.

SELECT c.*, csc1.changed_status
FROM contract c LEFT JOIN contract_changed_status csc1 ON c.contract_id = csc1.contract_id
INNER JOIN 
   (
    SELECT contract_id, changed_status, MAX(date_changed) AS 'max_date' 
    FROM contract_status_changed GROUP_BY contract_id
    GROUP BY contract_id
   ) csc2 ON csc1.contract_id = csc2.contract_id AND csc1.date_changed = csc2.max_date   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM