2015-10-19 49 views
1

這是一種很難的標題,但鑑於這一說法:選擇不同的行如果沒有一行返回

SELECT DISCOUNT FROM people_discounts WHERE ID = ? AND PGROUP = ? 

假設我輸入ID 5和PGROUP 2.該行不存在於表(fetch在PHP和mysqli的情況下返回false)。在這種情況下,我想將已經提交了聲明瞭該行:

SELECT DISCOUNT FROM people_discounts WHERE ID = ? AND PGROUP = 0 

隨着ID仍然是5,但PGROUP「回落」,以0代替,它讓我們假設始終存在

這可能與某種IF,CASE或其他一些我不知道的關鍵字?

我知道這當然可以通過在沒有行的情況下運行第二條語句來完成,但這不是我想要做的。

回答

2

假定查詢應永遠只能返回一行

select discount from people_discount 
where id = ? and (pgroup = ? or pgroup = 0) 
order by pgroup desc 
limit 1; 
+0

耶穌。我怎麼能想到這一點。也許是時候睡覺了。編輯:我的頭條還有一個INNER JOIN。什麼。 – nickdnk

1

如果limit似乎「不純」,你可以使用其他的技巧。

雖然它假定折扣從不爲負,這可能是更便攜:

select abs(max(case when proup <> 0 then discount else -discount end)) 
from people_discount 
where id = ? and pgroup in (?, 0) 
group by id 

並不是每一個平臺都有一個頂/極限/提取選項。有些人反對非基於集合的查詢。我只是簡單地向那些人提供一種黑客攻擊,或者至少是以不同方式思考問題的練習。

的想法是隻是假設不能有一個負的折扣和使用數字刻度的端部暫時「存儲」用於PGROUP 0 MAX()回退折扣由利於正值完成排序和限制的等效當兩者都存在時。 ABS()恢復結果的標誌。

+0

我其實不知道這是幹什麼的。限制完全回答我的問題。它根本不能解決我的問題的事實完全是另一回事。我應該去睡覺而不是問,儘管看起來這個問題讓人感興趣。編輯:我欣賞努力。只是我正在考慮刪除它,現在看起來像一個壞主意。 – nickdnk

+0

根據您的問題中的信息,這是一個完全有效的答案。我毫不懷疑'limit'選項對你更有用。 – shawnt00

+0

我的意思是我正在考慮刪除這個問題 - 我相信你的回答很好:) – nickdnk

相關問題