我怎样才能得到这些子查询的rif?如何用联接替换子查询?
(所有表都列上创建和LastEdited作为时间戳)
table Process
- ID
- Title
table ProcessHistory
- ID
- ProcessID
- HistoryID
table History
- ID
- Title (new, open, closed etc.)
当我试图让进程列表与上次状态称号的cols我做的:
SELECT DISTINCT Process.*, History.Title AS HistoryTitle, History.ID AS HistoryID
FROM `Process`
LEFT JOIN ProcessHistory AS ProcessHistory ON Process.ID=ProcessHistory.ProcessID
LEFT JOIN History AS History ON HistoryID=ProcessHistory.HistoryID
WHERE History.ID = (
SELECT HistoryID FROM ProcessHistory
WHERE ProcessID=Process.ID
ORDER BY ProcessHistory.ID DESC LIMIT 1
)
GROUP BY Process.ID
ORDER BY Process.ID DESC LIMIT 0, 100
当我尝试获取按特定状态过滤的列表 (其中最新HistoryID为1 - “所有打开的过程”)
SELECT DISTINCT Process.*, History.Title AS HistoryTitle, History.ID AS HistoryID
FROM `Process`
LEFT JOIN ProcessHistory AS ProcessHistory ON Process.ID=ProcessHistory.ProcessID
LEFT JOIN History AS History ON HistoryID=ProcessHistory.HistoryID
WHERE History.ID=(
SELECT HistoryID FROM ProcessHistory
WHERE HistoryID =1
AND ProcessID=Process.ID ORDER BY ProcessHistory.ID DESC LIMIT 1
)
GROUP BY Process.ID
ORDER BY Process.ID DESC LIMIT 0, 100
由于性能原因,我想摆脱这些子查询? 我如何替换子查询?
在此先感谢!
由您创建和加载的sqlfiddle将帮助我们帮助您。注意:加载并不意味着完全加载。这可能意味着每个表格有5到10行数据。 – Drew
这里的sql小提琴: http://sqlfiddle.com/#!9/3d9001/1 – derRobert
它真的是性能瓶颈还是这是不成熟的,甚至可能是非优化的优化? – e4c5