2010-08-29 139 views
7

我有一個MySQL表。我們稱之爲小工具。小工具表有3個字段:ID,type_id名稱。我希望在一個查詢中獲取所有使用名爲'doodad'的Widget共享type_id的小部件。我寫了2個查詢:MYSQL WHERE-IN子查詢永遠運行

  1. 給我名爲'doodad'的小部件的type_id。
  2. 給我所有使用該type_id的小部件。

This works。每個查詢獨立實現其目標。

但是,當我將它們組合成一個嵌套的查詢時,它會永遠運行,無限循環樣式。它看起來像這樣:

SELECT * FROM widgets WHERE type_id IN (
    SELECT type_id FROM widgets WHERE name = 'doodad' 
); 

任何人都可以解釋這一點嗎?是否因爲我正在編寫一個在同一個表上運行兩次的嵌套查詢?

小輪子,你爲什麼旋轉?

回答

6

There is an issue in MySQLin其中甚至不相關的子查詢被視爲好像它們被關聯並重新評估每一行。

在解釋計劃中,選擇類型可能會顯示爲dependant subquery,而不是像期望的那樣顯示爲subquery

我建議嘗試使用派生表來實現內部結果集的方法at the end of this article

或者,您可以查看constifyprocedure here以查看它是否可以幫助您解決此問題。

+0

我使用WHERE-IN子查詢的原因是因爲我以前使用JOIN ,並且針對200萬個小部件的數據庫,運行需要兩分鐘。作爲2個單獨的查詢,運行時間不到一秒鐘。 – Whit 2010-08-29 23:39:09

+0

@Whit - 我發現了一些解決方法,您可以嘗試查看是否可以開始工作。 – 2010-08-30 00:49:03

+0

我不能相信,在發明了這個constify 6年後,這仍然不是mysql的一部分。是不是隻是手動創建臨時表並加入它的別名? – fastmultiplication 2012-03-26 09:11:46

3

使用JOIN風險複製的結果 - 一個EXISTS將工作類似於IN,沒有重複的風險:

SELECT x.* 
    FROM widgets x 
WHERE EXISTS (SELECT NULL 
       FROM WIDGETS y 
       WHERE y.name = 'doodah' 
        AND y.type_id = x.type_id) 
+0

+1好點。知道這是否對OP更好的表現也會很有趣。 – 2010-08-29 23:46:12