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

时间:2015-10-19 23:37:16

标签: mysql

这很难成为标题,但鉴于此声明:

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 个答案:

答案 0 :(得分:2)

假设查询应该只返回一行

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

答案 1 :(得分:1)

limit似乎" impure"你可以使用其他技巧。

虽然假设折扣永远不会消极,但这可能更具便携性:

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

并非每个平台都有top / limit / fetch选项。有些人反对非基于集合的查询。我只是在考虑那些人,或者至少作为一种以不同方式思考问题的练习。

这个想法只是假设不存在负面折扣并且使用数字刻度的那一端暂时&#34;存储&#34; pgroup 0的后备折扣。MAX()通过在两者都存在时支持正值来完成等效的排序和限制。 ABS()恢复结果的符号。