选择不同的行如果没有一行返回

问题描述:

这是一种很难的标题,但鉴于这一说法:选择不同的行如果没有一行返回

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或其他一些我不知道的关键字?

我知道这当然可以通过在没有行的情况下运行第二条语句来完成,但这不是我想要做的。

假定查询应永远只能返回一行

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

耶稣。我怎么能想到这一点。也许是时候睡觉了。编辑:我的头条还有一个INNER JOIN。什么。 – nickdnk

如果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