我遇到了这个缓慢查询的问题:
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)表和一个contract_status_change表,用于记录契约(Contract)的状态。此查询正在加入合约的最新状态,以便您可以获得其当前状态..
你能帮我整理一下吗?
-编辑-
我很抱歉。我已更新查询以包括选择实际的最新状态。抱歉造成困惑!
最佳答案
格式化查询以提高可读性(一致的空格和大写,删除不必要的反引号和括号,更合理的别名):
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
;
您说它“正在加入合约的最新状态,以便您可以获得其当前状态”,但它不会对当前状态执行任何操作 - 不按顺序排序它不会被过滤,也不会将其包含在查询结果中 - 所以没有必要这样做。
关于mysql - 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8389559/