2012-04-25 57 views
1

當我使用這個查詢時,一切正常。 5結果爲0.3587秒。執行時溢出,當執行wihout限制時

SELECT `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, 
`prod_combined`.`link` 
FROM `prod_combined` 
WHERE 
(
    prod_combined.sku IN 
     (
     SELECT 
     prod_combined.sku FROM 
     (
      SELECT prod_combined.sku FROM prod_billiger 
      INNER JOIN 
      prod_combined ON prod_combined.sku = prod_billiger.sku 
      WHERE rangGesamt = 1 
      AND prod_combined.aktiv = 1 
     ) q 
     JOIN prod_combined ON prod_combined.sku = q.sku) 
) 
AND (aktiv = 1) 
LIMIT 0,5 

但是當我使用這個查詢,它運行大約3分鐘。

SELECT `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, 
`prod_combined`.`link` 
FROM `prod_combined` 
WHERE 
(
    prod_combined.sku IN 
     (
     SELECT 
     prod_combined.sku FROM 
     (
      SELECT prod_combined.sku FROM prod_billiger 
      INNER JOIN 
      prod_combined ON prod_combined.sku = prod_billiger.sku 
      WHERE rangGesamt = 1 
      AND prod_combined.aktiv = 1 
     ) q 
     JOIN prod_combined ON prod_combined.sku = q.sku) 
) 
AND (aktiv = 1) 

什麼我嘗試做: 把那上首位(prod_billiger.rangGesamt)的所有產品。我在「prod_billiger」表中獲得這些信息。其他產品信息來自prod_combined。

有沒有辦法加快速度?我是否需要過度查詢整個查詢?

問候, chucky2305

+0

如果使用相關名稱(「標記」)而不是整個表名,查詢會變得更具可讀性,特別是因爲您引用了相同的表四(四個!!!)次。順便說一句:prod_combined.sku是主鍵嗎? – wildplasser 2012-04-25 14:11:43

+0

我很抱歉。也許我應該開始一種新的方式。 關於我的應用程序,我需要把它寫在子查詢中。但我還不熟悉這些。你認爲你能幫助我嗎? – 2012-04-25 14:14:47

+0

你不能編輯帖子嗎?順便說一聲:rangGesamt從哪裏來? prod_billiger? – wildplasser 2012-04-25 14:15:21

回答

0

將這樣的事情對你的工作?

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link 
FROM prod_combined AS pc 
WHERE pc.sku IN (
    SELECT sku 
    FROM prod_billiger 
    WHERE rangGesamt = 1 
) 
AND pc.aktiv=1 

我加的代名詞prod_combined(prod_combined AS pc)只是爲了讓select說法更簡潔。

如果您的表格很小,或者您有一個關於rangGesamt和/或aktiv的索引,這將運行得非常快。

+0

謝謝。那很快。而且容易。;) 在我最後的查詢中,我收到了錯誤信息「IN/ANY ... is not allowed」 我不明白爲什麼它現在被MySQL接受 – 2012-04-25 14:39:33

+0

@MaxSchindler不確定。也許你正在做'WHERE pc.sku =(SELECT sku ...'而不是'WHERE pc.sku IN(SELECT sku ...'),如果子查詢返回多於一行的話會引發錯誤,如果你想發佈查詢,我可以快速瀏覽它 – csm8118 2012-04-25 14:50:05

+0

我想,但我已經拋棄了我的測試查詢但是我很確定我已經用IN和還對這些的有錯誤報道 這就是我得到當我試圖錯誤:(對不起它寫在德國) Diese的MySQL版本unterstützt「極限和IN/ALL/ANY/SOME子查詢」 nicht – 2012-04-25 14:56:15

0

重寫你的查詢獲取我:

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc 
FROM prod_combined pc 
WHERE 
(
    pc.sku IN 
     (
     SELECT 
     pc2.sku FROM 
     (
      SELECT pc2.sku FROM 
      prod_billiger pb 
      INNER JOIN prod_combined pc2 ON pc2.sku = pb.sku 
      WHERE pb.rangGesamt = 1 
      AND pc2.aktiv = 1 
     ) q 
     JOIN prod_combined pc3 ON pc3.sku = q.sku 
     ) 
) 
AND pc.aktiv = 1 
; 

,這可能是equivalient到:

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc 
FROM prod_combined pc 
WHERE pc.sku IN (
     SELECT q.sku 
     FROM (
      SELECT pc2.sku FROM 
      prod_billiger pb 
      INNER JOIN prod_combined pc2 ON pc2.sku = pb.sku 
      WHERE pb.rangGesamt = 1 
      AND pc2.aktiv = 1 
      ) q 
     ) 
AND pc.aktiv = 1 
     ; 

其可以進一步簡化爲:

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc 
FROM prod_combined pc 
WHERE EXISTS (
     SELECT * 
      FROM prod_billiger pb 
      INNER JOIN prod_combined pc2 ON pc2.sku = pb.sku 
      WHERE pb.rangGesamt = 1 AND pc2.aktiv = 1 
      AND pc.sku = pb.sku; 
     ) 
AND pc.aktiv = 1 
     ; 

如果 「SKU」是prod_combined的主鍵,子查詢甚至可以進一步減少,只包含「prod_billiger」。

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc 
FROM prod_combined pc 
WHERE EXISTS (
     SELECT * 
      FROM prod_billiger pb 
      WHERE pc.sku = pb.sku; 
      AND pb.rangGesamt = 1 AND pc2.aktiv = 1 
     ) 
AND pc.aktiv = 1 
     ; 

其與更多或更少的當量:

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc 
FROM prod_combined pc 
WHERE pc.sku IN (
     SELECT sku 
     FROM prod_billiger pb 
     WHERE pb.rangGesamt = 1 
     ) 
AND pc.aktiv = 1 
     ; 

如果SKU也是主(或候選),用於prod_billiger鍵,事情甚至可以進一步簡化爲:

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc 
FROM prod_combined pc 
JOIN prod_billiger pb ON pc.sku = pb.sku 
WHERE pb.rangGesamt = 1 
AND pc.aktiv = 1 
     ; 
+0

是的,sku是主鍵。那麼如何減少呢? – 2012-04-25 15:06:09