2011-07-05 13 views
0

紛らわしいタイトルについてお詫び申し上げます。私は思ったんだけど、このです:私はそのWHERE条件内のサブクエリによって返された結果セットに対して複数列IN比較を行い、SELECTクエリを持っています。そのサブクエリの結果と比較したいものは、親のSELECTクエリの値といくつかの定数がそれぞれ含まれる2つの値のセットです。言い換えればMySQL INの複数の混合値の行とサブクエリの比較

は、どのように私は、この作品のようなものにすることができます。この場合

SELECT ... WHERE ((id, 1, 2, 3), (id, 4, 5, 6)) IN (SELECT a, b, c, d FROM atable) 

を、「idは」親SELECT文によって提供されていますが、他の値は定数です。意図は、これらの2つの値のセットを 'atable'の異なる値(a、b、c、d)の多くのセットと比較することです。

私はそれを繰り返しますので、(私はORを追加し、個別にサブクエリの結果に対する2つの可能なセットを比較するIN比較を繰り返すことで、この作業を行うことができますが、私は、効率のためにそれを行うにはしたくない知っていますサブクエリ)。

この要求は非常にエレガントな言葉で表現されなかった場合、私は謝るが、私は意味が出くわす願っています。私はGoogleを検索し、MySQLのドキュメントを読んでみることにしました。(おそらく問題の言葉をうまく言えないためです。あなたの時間と助けを事前に

感謝。

答えて

1

現実の世界の状況によっては、次の要因がお客様のニーズに合っていますか?

SELECT 
    * 
FROM 
    query 
WHERE 
    EXISTS (
    SELECT 
     * 
    FROM 
     atable 
    WHERE 
     a = query.id 
     AND (
      (b = 1 AND c = 2 AND d = 3) 
      OR 
      (b = 4 AND c = 5 AND d = 6) 
     ) 
) 


または可能性...

SELECT 
    * 
FROM 
    query 
INNER JOIN 
(
    SELECT atable.a FROM atable 
    WHERE (b = 1 AND c = 2 AND d = 3) OR (b = 4 AND c = 5 AND d = 6) 
    GROUP BY atable.a 
) 
    AS filter 
    ON filter.a = query.id 
一般的な意味での


アン...

SELECT 
    * 
FROM 
    query 
INNER JOIN 
(
    SELECT 
    atable.a 
    FROM 
    atable 
    INNER JOIN 
    (
    SELECT 1 AS b, 2 AS c, 3 AS d 
    UNION ALL 
    SELECT 4 AS b, 5 AS c, 6 AS d 
) 
    AS patterns 
     ON patterns.b = atable.b 
     AND patterns.c = atable.c 
     AND patterns.d = atable.d 
    GROUP BY 
    atable.a 
) 
    AS filter 
    ON filter.a = query.id 
3

まだ合理的に遅く感じる。結合を使うだけでは意味がありませんか?

select query.* from query 
inner join atable on (atable.a=query.id) and ((b=1 and c=2 and d=3) or (b=4 and c=5 and d=6) 

これはまだ読みやすく、非常に高速です。結合の余分な条件に注意してください。

+0

+1:Doh、yeah、hmmm、私の努力は馬鹿に見えます:) – MatBailie

0
SELECT ... 
WHERE EXISTS 
    (SELECT * 
    FROM 
     (SELECT a, b, c, d FROM atable 
    ) AS tmp 
    WHERE (id, 1, 2, 3) = (a, b, c, d) 
     OR (id, 4, 5, 6) = (a, b, c, d) 
) 

又はEljakimがわずかに変更され、示唆JOIN。あなたはおそらく重複した結果を削除するGROUP BYが必要になります:

SELECT ... 
    JOIN 
     (SELECT a, b, c, d FROM atable 
    ) AS tmp 
    ON (id, 1, 2, 3) = (a, b, c, d) 
    OR (id, 4, 5, 6) = (a, b, c, d) 
GROUP BY id 
0

あなたは可能性もUNIONいくつかの異なるクエリを一緒に。時には2つのより単純な照会のUNIONは、1つのより複雑な照会より最適化によって最適化されることがあります。そうでなければならないが、しばしばそうである。

P.S.私はdownvoteの理由を知っていただければ幸いです。上記の懸念事項はパフォーマンスのためのものでした(「遅い感じです」)。気分?

+1

UNIONには一時テーブルが必要です。UNION ALLは少し速くなりますが、重複する可能性があります。 UNIONからの結果をソートするのは非常に高価な操作です。 – Eljakim

関連する問題