2011-12-26 27 views
6

これらのMySQLクエリを結合しようとしていますが、正しく取得できません。ここでは、1行のSQL文を取得するために組み合わせることを望んでいる疑似コードを示します。同じテーブルの複数のクエリを1つのSQL文に結合する

$var1 = "abc" 
$var2 = "def" 

IF ($var1 IN (SELECT DISTINCT col1 FROM t1)) 
{ 
    SELECT colA, colB, colC FROM t1 WHERE col1 = $var1 AND col2 LIKE '%$var2%' 
} 
ELSE 
{ 
    SELECT colA, colB, ColC FROM t1 WHERE col2 LIKE %$var1% 
} 

おかげ

+1

これまでに試したことはありますか? – hakre

+0

FROM t1'では、 'IF $ ''(SELECT DISTINCT col1 FROM t1)、(colA、colB、colC)、)FROM t1'を試しましたが、if文のフローで失われます。 – user1115729

答えて

5

まず私はmjfgatesが正しいかもしれないとしましょう。オリジナルの擬似コードは2つのステップしかないので「悪い」ではありません。クエリ・エンジンが最適なプランを見つけられない可能性が高いほど、SQL文が複雑になります。この特定のケースでは、単一のテーブルが複数回参照されているため、その可能性は低くなりますが、これらの状況では一般的に留意する必要があります。 SQLを1つのステートメントにすることは、必ずしもそれ自体にとって価値ある目標ではありません。

は今、あなたの質問に答えるために:

select colA,colB,colc from table1 t1 
    where 
    (
    (col1 = $var1 and col2 like '%$var2%') and 
      EXISTS (select 1 from table1 t2 where t2.col1 = $var1) 
    ) 
    or 
    (
    (col2 LIKE %$var1%) and 
      NOT EXISTS (select 1 from table1 t3 where t3.col1 = $var1) 
    ) 
+0

これは機能します!ありがとう! – user1115729

+0

問題ありません。それがあなたを助けてくれたら、答えを受け入れてください。 – TetonSig

3

を私は...私はそれをしないだろうと思います。これは、それぞれがifステートメントを持つストアドプロシージャとビューが作成されたようなものです。選択肢を最も具体的なものから順に実行し、行を与える最初の結果を返します。

また、ここにバグが表示されることがあります。テーブルにcol1 = $ var1の項目があり、それらの項目のどれも$ var2のようなcol2を持っていない項目があるとどうなりますか?何が起こるはずですか?

+0

優れた点。私は反映するために私の答えを更新しました。 – TetonSig

関連する問題