2011-07-15 18 views
1

より良い方法私は次のクエリを持っている:それは作品MySQLの - サブクエリ

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を使用しようとしましたが、私は本当にこの場合でもその作業を行う方法を理解していません。

ご迷惑をおかけして申し訳ありません。

+0

を缶一つのレコードよりも多くの 'ANY'サブクエリの戻り? – Quassnoi

+0

はい、それは常にそうです。助けてくれてありがとう! – Jason

答えて

1

JOINの使い方を学ぶ必要があります。 1つの列の値を複数の表に一致させる場合は、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' 
+0

重複した 'WHERE'節は必要ないと思います。 –

+0

tb1からtb3まで2つの異なるcol3句をチェックするには、2つの別々の結合が必要だと思います。 –

+0

@joshありがとう....固定 –

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' 
+0

ジェイソン、私の答えとジョーの両方があなたのデータのために結果がどのように異なっているかを調べる価値があります。 –

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)