MySQL - 比子查询更好的方法

时间:2011-07-15 13:35:07

标签: mysql query-optimization

我有以下查询:

SELECT col1, col2, col3 FROM tb1
WHERE col4=ANY(
  SELECT col1 FROM tb2
  WHERE col2=(SELECT col1 FROM tb3 WHERE col3='php generated string')
  AND col3=(SELECT col2 FROM tb3 WHERE col3='same string as above')
);

它有效,但速度很慢。我知道有一种更好(更快)的方法可以做到这一点,但是我缺乏SQL查询经验意味着我正在努力使它变得比它需要的更难。我尝试过使用JOIN,但我也不知道如何在这种情况下使用它。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

您需要了解如何使用JOIN。如果您要匹配多个表中一列的值,那么您应该JOIN将这些表ON放在一起{。}}。

SELECT tb1.col1,tb1.col2,tb1.col3 
FROM tb1
JOIN tb2
  ON (tb1.col4 = tb2.col1)
JOIN tb3
  ON (tb1.col2 = tb3.col1
  AND tb1.col3 = tb3.col2)
WHERE tb3.col3 = 'php generated string'

答案 1 :(得分:1)

SELECT tb1.col1, tb1.col2, tb1.col3
    FROM tb1
        INNER JOIN tb2
            ON tb1.col4 = tb2.col1
        INNER JOIN tb3
            ON tb1.col2 = tb3.col1
                AND tb3.col3 = 'php generated string'
        INNER JOIN tb3
            ON tb1.col3 = tb3.col2
                AND tb3.col3 = 'same string as above'

答案 2 :(得分:1)

如果ANY中的子查询可以返回多条记录,那么将您的查询重写为JOIN将导致重复。

使用此:

SELECT  col1, col2, col3
FROM    tb1
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    tb3
        JOIN    tb2
        ON      tb2.col2 = tb3.col1
                AND tb2.col2 = tb3.col2
                AND tb2.col1 = tb1.col4
        WHERE   tb3.col3 = 'php generated string'
        )

并创建以下索引:

tb2 (col1, col2, col3)
tb3 (col3)