2012-04-25 55 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