2017-02-27 3 views
0

私のサイトの相対的なシステムを作成しています。 結果行がi setup-1条件を満たさない場合は、クエリが必要です。mysqlは制限時に条件を追加します

私の例:

SELECT * FROM `animal` WHERE (`color_id`=1) LIMIT 4 

4よりも結果行が少なく、私は条件

SELECT * FROM `animal` WHERE (`color_id`=1) OR (`breed_id`=1) LIMIT 4 

を追加し、1つのクエリでそれを行う方法

SELECT * FROM `animal` WHERE (`color_id`=1) OR (`breed_id`=1) OR (`type_id`=1) LIMIT 4 

を続けますか?可能であれば

+1

結果セットの場合、再実行、変更されたクエリは、小さなにあるMYSQLの仕事ではありませんが、あなたのコードの実行クエリ。 – dognose

+1

実際にはそれを行う方法がありますが、使用しないでくださいがとても醜いでしょう。私はここで@dognoseと完全に同意する。アプリケーションで処理させます。 –

+0

@JorgeCampos私は「醜い」アプローチで答えました。本番システムでの使用はお勧めしません。 – dognose

答えて

3

結果セットが小さい場合に変更されたクエリを再実行することは、MYSQLの仕事ではなく、クエリを実行するコードの仕事です。

A本当に「汚い」アプローチは、結果セットは、常に十分な大きさを確保するためにUnionを使用することで、最終的にはわずか4行(テーブルと仮定すると、少なくとも4つのエントリが含まれている)に限定します:

SELECT * FROM (
    SELECT * FROM `animal` WHERE (`color_id`=1) LIMIT 4 
    UNION 
    SELECT * FROM `animal` WHERE (`color_id`=1) OR (`breed_id`=1) LIMIT 4 
    UNION 
    SELECT * FROM `animal` WHERE (`color_id`=1) OR (`breed_id`=1) OR (`type_id`=1) LIMIT 4 
    UNION 
    SELECT * FROM `animal` LIMIT 0,4 
) as temp LIMIT 0,4 

技術的には、これはすべてのクエリに対して4行をフェッチし、まだその行が含まれていない場合のみ結果セットに追加します。最終結果(最悪の場合は16行)から最初の4行が取得されます。最初の3つのクエリのどれもが結果を提供しない場合、データベースに存在する最初の4つの動物が返されます。

0

私はアプリケーションコードでこれを実行します。

しかし、それが動作するかどうかだけを参照するには、あなたがこの試すことができます:

select * 
from `animal` 
where `color_id` = 1 
    or (
     `breed_id` = 1 
     and (
      select count(*) 
      from `animal` 
      where `color_id` = 1 
      ) < 4 
     ) 
    or (
     `type_id` = 1 
     and (
      select count(*) 
      from `animal` 
      where `color_id` = 1 
       or `breed_id` = 1 
      ) < 4 
     ) LIMIT 4 
関連する問題