2011-07-20 50 views
2

我有一個由以下結構和記錄組成的表,我只想提取orderid狀態id爲1或2的那些記錄,我想排除與statusid = 3的所有訂單ID,問題是訂單ID 106具有兩個狀態和3 ... 我寫了一個子查詢,供應的目的..在MySQL中使用連接代替這個子查詢

select * 
from orders_status_history 
where orders_id NOT IN 
    (select orders_id 
    from orders_status_history 
    where orders_status_id = 3) 

是否有任何其他方式這樣做而不使用子查詢,因爲我聽說它妨礙了性能。因爲我的查詢也可以返回數千行。

id order-id status-id 
1  1   1 
2  2   1 
3  105   1 
4  106   1 
5  106   3 
6  108   1 
7  109   1 
8  109   2 

任何幫助或建議將不勝感激..Thanks提前..

回答

4

你可以這樣做:

SELECT osh.* 
FROM orders_status_history osh 
LEFT JOIN 
     orders_status_history oshd 
ON  oshd.orders_id = osh_orders_id 
     AND oshd.orders_status_id = 3 
WHERE oshd.orders_id IS NULL 

不過,如果你對order_status_history (orders_id, orders_status_id)有一個索引,那麼NOT IN查詢也一樣好。

您可能需要閱讀此:

+0

thnx很多先生..它爲我做了伎倆......所有我可以說是Thnx Thnx Thnx Thnx –

0

我不知道爲什麼你使用子查詢時,您可以使用下面的查詢

select orders_id from orders_status_history where orders_status_id <> 3 

請試試這個,和我希望它有幫助

+0

Thnx,但它不起作用,因爲它會返回所有記錄,除了statusid爲3的記錄以外,但一條記錄同時具有statusid,即106具有1和3兩者。 –

+0

嘗試加入兩個表;
從orders_status_history中選擇osh1.orders_id osh1.order_id = osh2.order_id中的orders_status_history osh2其中orders_status_id <> 3 –

+0

它只是返回表中的所有行... –