[英]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.