2016-07-27 58 views
-1

为了提高性能,使用JOIN for MySQL 5.6+重写此查询是否有意义?如果是这样,怎么样?使用JOIN重写嵌套SELECT MySQL

SELECT col1, col2, col3 FROM tab WHERE 
col2 > 1234 
AND col2 < 9876 
AND col3 IN (1,2,3,4) 
AND col1 IN (SELECT col1 FROM tab 
      WHERE col3 IN (1,2,3,4) 
       AND col4 = 10 
      GROUP BY col1 
      HAVING COUNT(DISTINCT col3) = 4) 
+2

由于您在内部选择中使用GROUP BY和HAVING,因此很可能无法使用JOIN写入此查询。 – Galz

回答

0

我能想到两种可能的解决方案。

首先你做一个加入到子查询,而不是使用IN子句

SELECT tab.col1, 
     tab.col2, 
     tab.col3 
FROM tab 
INNER JOIN 
(
    SELECT col1 
    FROM tab 
    WHERE col3 IN (1,2,3,4) 
    AND col4 = 10 
    GROUP BY col1 
    HAVING COUNT(DISTINCT col3) = 4 
) sub0 
ON tab.col1 = sub0.col1 
WHERE col2 > 1234 
AND col2 < 9876 
AND col3 IN (1,2,3,4) 
AND col1 IN 

取决于匹配的数量等,这可能是更有效的。

可能效率更高但灵活性更低的方法是将col3的每个特定值与您需要的col4值相加来回到表格。如果有任何遗漏,则排除连接结果。不好的一面是你需要在SELECT上使用DISTINCT来删除重复项。

SELECT DISTINCT tab0.col1, 
     tab0.col2, 
     tab0.col3 
FROM tab AS tab0 
INNER JOIN tab AS tab1 ON tab0.col1 = tab1.col1 AND tab1.col3 = 1 AND tab1.col4 = 10 
INNER JOIN tab AS tab2 ON tab0.col1 = tab2.col1 AND tab2.col3 = 2 AND tab2.col4 = 10 
INNER JOIN tab AS tab3 ON tab0.col1 = tab3.col1 AND tab3.col3 = 3 AND tab3.col4 = 10 
INNER JOIN tab AS tab4 ON tab0.col1 = tab4.col1 AND tab4.col3 = 4 AND tab4.col4 = 10 
WHERE tab0.col2 > 1234 
AND tab0.col2 < 9876 
AND tab0.col3 IN (1,2,3,4) 
+0

以后真的能为你工作吗? – pedmillon

+0

@pedmillon - 未经测试,但它应该作为原始查询的等价物 – Kickstart