我对这个缓慢的查询有一个问题:
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表,这两个表记录了合同的状态。此查询将连接合同的最新状态,以便您可以获得其当前状态。
你能帮我整理一下吗?
-编辑-
我很抱歉。我已经更新了查询,包括选择实际的最新状态。很抱歉给您带来了混乱!
发布于 2011-12-06 02:09:43
对查询进行可读性格式化(一致的空格和大小写,删除不必要的反引号和括号,更合理的别名)后:
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
;您说它“正在将最新状态加入到合同中,这样您就可以获得它的当前状态”,但是它不会对当前状态做任何事情--不会按当前状态排序,不会根据它进行过滤,也不会将其包含在查询结果中--所以没有必要这么做。
发布于 2011-12-06 05:43:11
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 https://stackoverflow.com/questions/8389559
复制相似问题