2010-09-22 79 views
0

我有一個SQL查詢的問題,這裏有什麼,我試圖做一個概括:MySQL選擇select?

select 
oh.a as a, 
oh.b as b, 
oi.c as c, 
(select h.d from history h where h.id = oh.id and h.d not in ('d1', 'd2') order by h.date limit 1) as d 
from order_header oh 
join order_item oi on oh.order_id = oi.order_id 
where oh.state in (0, 10, 20) 

我的問題是這種類型的查詢在MySQL 5.0.77版本工作正常,但它失敗在MySQL版本5.1.47中。而問題的意思是,當查詢運行時,MySQL將CPU固定在100%,並且它永遠不會完成。即使在select前面加上解釋也會使查詢永遠不會返回。

任何建議或指針將不勝感激!

感謝, 道格

+0

你給了多久?除了你的版本之外,還有其他改變嗎尺寸?數據? – 2010-09-22 16:31:50

回答

1

這是我會怎麼寫這個查詢:

select 
oh.a as a, 
oh.b as b, 
oi.c as c, 
h1.d as d 
from order_header oh 
join order_item oi on oh.order_id = oi.order_id 
left outer join history h 
on h.id = oh.id and h.d not in ('d1', 'd2') 
left outer join history h2 
on h2.id = oh.id and h2.d not in ('d1', 'd2') 
and (h.date > h2.date or h.date = h2.date and h.id > h2.id) 
where oh.state in (0, 10, 20) and h2.id is null 
+0

比爾,感謝您的反饋,我會採取您的建議,並適應我的實際查詢,並與它做一些測試。再次,謝謝! – 2010-09-24 12:57:44

1

我發現MySQL's profiling mode是一樣有用的講解。您可以在運行查詢之前啓用它,然後轉儲每個步驟的計時。這是優化子查詢的一種非常方便的方式 - 您可能會注意到,您的子查詢正在爲SELECT子句中的每一行執行,因爲它可以執行一次WHERE子句。

+0

謝謝傑夫,那非常方便。解釋的事情是好的,但它只會給你和「想法」需要多長時間。我會試試這個! – 2010-09-24 12:56:07