返回与一个条件匹配的行,如果在MYSQL中没有匹配的行

时间:2019-02-28 08:01:19

标签: mysql

我以下表为例:

numbers    type
--------------
1          1
5          2
6          1
8          2
9          3
14         2 
3          1

我要从该表中选择小于或等于类型1的5 AND的最接近的数字,如果没有这样的行匹配,那么(并且只有这样)我想返回第一个更大的最接近的数字超过2型的5

我可以通过运行两个查询来解决此问题:

SELECT number FROM numbers WHERE number <= 5 AND type = 1 ORDER BY number LIMIT 1

如果上面的查询返回0个结果,我只需运行第二个查询:

SELECT number FROM numbers WHERE number > 5 AND type = 2 ORDER BY number LIMIT 1

但是有可能仅通过一个查询就可以达到相同的结果吗?

我在想类似的东西

SELECT number FROM numbers WHERE (number <= 5 AND type = 1) OR (number > 5 AND type = 2) ORDER BY number LIMIT 1

但这只会起作用,如果mysql首先针对所有行检查括号中的第一个条件,如果找到匹配项,则将其返回,如果不匹配,则针对第二个括号条件检查所有行。如果将每一行都与两个括号进行对照,然后才移至下一行,那将是行不通的。

2 个答案:

答案 0 :(得分:2)

此查询将执行您想要的操作。它选择与您的两个查询约束匹配的所有数字,并首先按type对结果进行排序(这样,如果类型1的结果出现,它将首先出现),然后按-number或{{ 1}}取决于number(因此,数字<= 5以降序排列,数字> 5以升序排列):

type

输出:

SELECT number 
FROM numbers
WHERE ( number <= 5 AND type = 1 )
   OR ( number > 5 AND type = 2 )
ORDER BY type, CASE WHEN type = 1 THEN -number ELSE number END
LIMIT 1

Demo on dbfiddle

答案 1 :(得分:0)

将两者组合在一起,并且您总是更喜欢类型1而不是类型2,因此<button is="my-el" type="button">Click me</button>ORDER BYLIMIT表示以数字为准的数字中的第一个数字。

ABS