2011-08-29 80 views
2

在我的MySQL數據庫中,我有兩個表:'orders'和'orders_lines'。訂單包含有關客戶的信息,訂單日期等。 Orders_lines包含有關產品的數據,如product_id,價格,數量,稅率等。MySQL查詢使服務器崩潰?

我目前正在建立一個搜索頁面,我想要返回包含特定產品的訂單。例如,我想用的product_id 2.返回所有的訂單我覺得像一個查詢:

SELECT * FROM orders WHERE order_id IN (SELECT order_id FROM orders_lines WHERE product_id = 2)

但是,當我今天早上執行查詢我只好打電話給託管服務提供商終止了MySQL過程,因爲它是沉重的方式。從來沒有聽說過它,不知道爲什麼,我現在很絕望。 orders表包含大約30.000行,orders_lines表大約有38.000行。

任何建議爲什麼我的數據庫崩潰,如何更改查詢以使其正常工作或如何實現顯示包含某個產品的訂單的目標,歡迎您!

親切的問候,

的Martijn

+1

你有什麼指標在桌子上?你能發表表格的定義嗎? –

+0

答案是否可以,'order_lines.order_id'無效? –

+0

但如何查詢放下一個MySQL服務器自己?使所有其他查詢/連接變慢?爲什麼 – Miguel

回答

1

我不知道這是你需要什麼,反正試試:

SELECT DISTINCT o.* FROM orders o 
INNER JOIN order_lines ol 
ON o.order_id = ol.order_id 
WHERE ol.product_id = 2 
+0

你錯過了一個'DISTINCT'。 –

+0

@Daniel:我認爲在order_lines中你不能有多於一行product_id = 2 ...應該有一個數量列...我錯了嗎?無論如何,感謝您的建議! – Marco

+0

這是一個可能正確或不可能的假設。如果同一產品的每個訂單有多個order_lines,那麼如果不同,則相應的訂單將被多次返回。 –

1

據我所知道的是內部連接(又名naturual加入)最好在這種情況下的路要走。 '在哪裏..在..往往是一個昂貴的操作。

SELECT DISTINCT o.* FROM orders o 
INNER JOIN orders_lines ol ON o.order_id = ol.order_id 
WHERE ol.product_id = 2 
+0

類似的回答很好,但在同一時間完全一樣!你想讓我刪除我的嗎? :) – Marco

+0

您錯過了'DISTINCT'。 –

+0

@Daniel,我的確是,tx – Peter

2

查詢可以用JOIN(和GROUP BY)被改寫:

SELECT o.* 
FROM orders o 
    INNER JOIN order_lines ol 
    ON o.order_id = ol.order_id 
WHERE ol.product_id = 2 
GROUP BY o.order_id 

或最好 - 因爲您只需要orders表中的結果 - 與EXISTS

SELECT * 
FROM orders AS o 
WHERE EXISTS 
     (SELECT * 
     FROM orders_lines AS ol 
     WHERE ol.product_id = 2 
      AND ol.order_id = o.order_id 
    ) 

但是在再次運行可能導致服務器故障的事情之前,請檢查您的索引和EXPLAIN

+0

+1解釋。 – Johan