2012-05-20 35 views
0

我問過關於前一個線程中多行的問題,但現在我需要知道單個行。這是一個例子查詢:MySQL - 如何查詢一個值,但默認爲另一個值?

SELECT * FROM table1 WHERE this = 5 LIMIT 1 

但如果發現沒有行,那麼我會它,然後找到記錄有不同的值:

SELECT * FROM table1 WHERE this = 1 LIMIT 1 

所以,我要的是,找到一個排這個值爲5,如果沒有找到,則默認爲查找值爲1的行。我如何在單個查詢中執行此操作? OR語句是這樣工作的嗎?

SELECT * FROM table1 WHERE this = 5 OR this = 1 LIMIT 1 

請問或語句的順序嘗試找到任何一行5的值,如果找到那麼將停止並返回行?如果找不到,然後查找1,然後返回該行?如果沒有,那麼如何在一個查詢中搜索一個值,如果找不到缺省值查找另一個值呢?

我在想這個查詢:

SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this ASC LIMIT 1 

但是這個查詢將始終與1返回值,如果發現這兩個值嗎?所以我試過這個:

SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1 

但是,如果兩行都被發現正確的話,這總是會返回5的值?

+0

你想要什麼,如果兩行被發現發生的呢? –

+0

@伊格雷戈裏無論選擇什麼。因此,如果選擇從數據庫查看記錄的人的值爲5,但沒有記錄的值爲5,那麼我希望它默認加載值爲1. – John

+0

如果要選擇「這個'有多個值?你是動態創建你的語句還是在程序中? – Ben

回答

1

您的問題似乎優先搜索5,只有找不到,然後搜索1.因此,您的第二個解決方案符合要求罰款。無論是隻有5還是5和1,它都會返回5的值。

第二個選項

SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1 
+0

我認爲你是對的。我可能會想到這一點。因爲如果某人選擇查看值爲5的行,它只會是IN(5,1)。 – John

+0

您的'order by'應該是'case'語句。不能保證'this'的順序是正確的。 – Ben

+0

@Ben這就是爲什麼我們有這個DESC命令。這將確保結果按照「this」的降序進行排序,無論MySQL首次發現哪些行。 – somnath

0

試試這個

SELECT * 
FROM table1 tab 
WHERE tab.this = IF((SELECT COUNT(*) 
        FROM table1 
        WHERE this = 5) > 0, 5, 1) 

的IF內的查詢被檢查的次數。

我不確定其性能,但我認爲這解決了您的問題。

+0

只是爲了澄清,如果([評估此],[如果這是真的話],[如果這是假的]) – nycynik

+0

@nycynik是的,這是正確的。 – JHS

相關問題