2017-02-27 34 views
0

我爲我的網站創建相關係統。 我需要查詢,當結果行少於我安裝 - 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 

,並繼續

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

怎麼做1個查詢?如果可能的話

+1

重新運行在結果集的情況下改變查詢是小不MYSQL的工作,但你的代碼執行查詢。 – dognose

+1

其實有辦法做到這一點,但它會是如此醜陋,你不應該使用。我完全同意@dognose這裏。讓你的應用程序處理它。 –

+0

@JorgeCampos我用一種「醜陋」的方法回答 - 不會推薦在生產系統上使用。 – dognose

回答

3

如果結果集爲小,重新運行已更改的查詢不是MYSQL的工作,而是執行查詢的代碼。

一個非常「髒」的做法是使用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