基本的に私はこのクエリを持っています:
( 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番目のクエリを実行したいと思います。出来ますか?
最初の「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
「タイプ」列にインデックスがある場合、最初のクエリはほぼ瞬時に実行されます。
それはトリックを行います:
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
あなたは書くことができます
select * from tbl
where type = 1
union
select * from tbl
where type = 2
and not exists( select * from tble where type = 1 )
しかし、これはおそらくあなたのプログラムでそれを行うだけではうまくいきません