1

基本的に私はこのクエリを持っています:

( SELECT * FROM tbl WHERE type = 'word1' )
  UNION
( SELECT * FROM tbl WHERE type = 'word2' ) // Run this query if there are no results with type = 1

基本的に、最初のクエリで結果が得られない場合にのみ、2番目のクエリを実行したいと思います。出来ますか?

4

3 に答える 3

1

最初の「PreCheck」クエリは、タイプ = 1 のレコード数をカウントします。その後、カウントが 1 より大きい場合は 1 を返し、それ以外の場合は 2 を返します。

これで、1 または 2 の値を持つ結合 (常に COUNT(*) による単一の行) でその回答を使用できます。その値が 2 番目の値になることは、EQUALITY 条件です。したがって、1 のエントリがある場合、結果は次のようになります。

WHERE t1.Type = 1

したがって、テストで 2 を許可することはありません。ただし、エントリが見つからない場合は、値が 2 になるため、WHERE 句が作成されます。

WHERE t1.type = 2

select t1.* 
   from 
      ( select if( count(*) > 0, 1, 2 ) IncludeType
           from tbl t2
           where t2.type = 1 ) preCheck,
      tbl t1
   where 
      t1.type = preCheck.IncludeType

「タイプ」列にインデックスがある場合、最初のクエリはほぼ瞬時に実行されます。

于 2012-04-28T01:22:22.410 に答える
0

それはトリックを行います:

SELECT tbl.* FROM tbl JOIN (SELECT min(type) min_type FROM tbl WHERE type between 1 and 2 ) on min_type = type

最初に、これら 2 つのタイプのうち小さい方を選択し (存在する場合)、この 1 つの数値テーブルをテーブルに追加します。実際には単純なフィルターです。必要に応じて、JOIN の代わりに WHERE を使用できます。

SELECT tbl.* FROM tbl WHERE (SELECT min(type) FROM tbl WHERE type between 1 and 2 ) = type
于 2012-04-28T01:03:45.863 に答える
0

あなたは書くことができます

select * from tbl 
where type = 1 
union 
select * from tbl 
where type = 2 
and not exists( select * from tble where type = 1 )

しかし、これはおそらくあなたのプログラムでそれを行うだけではうまくいきません

于 2012-04-28T01:02:54.893 に答える