2014-02-27 39 views
0

我有這樣的一個表:MySQL的回報默認記錄,如果沒有匹配(無限制)

----------------------------------------- 
| ID | ACTIVE |  MESSAGE  | 
----------------------------------------- 
| 0 |  0 | Default message | 
----------------------------------------- 
| 1 |  1 | Message one  | 
----------------------------------------- 
| 2 |  1 | String two  | 
----------------------------------------- 
| 3 |  0 | Text three  | 
----------------------------------------- 

我一直在尋找一個MySQL查詢好幾個小時,我展示了紀錄ID = 0爲默認結果如果沒有消息是「活動的」。如果有一個或多個活動消息,我想要獲取這些記錄。

SELECT * FROM table WHERE ACTIVE = 1; 

另外,一個選項可以通過UNION或類似的想法在查詢中手動添加默認記錄。總是添加默認記錄,ORDER,然後LIMIT 1不適用於我,因爲我需要找回所有active消息(如果存在的話),而不僅僅是一個。

另一個約束:我的表和WHERE條件在現實世界中更復雜,處理開始和結束時間戳比較。

回答

0

這個怎麼樣(未經測試):

SELECT * FROM table WHERE id = 0 AND NOT EXISTS (SELECT * FROM table WHERE active = 1) 
UNION SELECT * FROM table WHERE ACTIVE = 1; 

這也許不是很有效,但是它依賴於的記錄數。
一個活躍的指數可以幫助,以防萬一。

它應該適合您的問題:如果有active = 1行,它們從union的第二個查詢返回,而第一部分解析爲空集(因爲EXISTS子查詢將失敗)。如果沒有,則第二個查詢將不返回任何內容,而第一部分返回id = 0的行,因爲EXISTS子查詢現在會成功。

+0

作品!非常感謝。 – user3362109

0

將默認消息(id = 0)保存在您的實際應用程序代碼中,只需查詢一次並保存即可。如果沒有結果,請使用您在那裏寫下的查詢,然後使用您保存在應用程序代碼中的默認消息。

你試圖做的並不是很乾淨,有辦法在MySQL中做到這一切,正如Watery的答案所表明的那樣,但它效率不高並且不是解決問題的最佳方式。

相關問題