我以下表为例:
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首先针对所有行检查括号中的第一个条件,如果找到匹配项,则将其返回,如果不匹配,则针对第二个括号条件检查所有行。如果将每一行都与两个括号进行对照,然后才移至下一行,那将是行不通的。
答案 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
答案 1 :(得分:0)
将两者组合在一起,并且您总是更喜欢类型1而不是类型2,因此<button is="my-el" type="button">Click me</button>
和ORDER BY
。 LIMIT
表示以数字为准的数字中的第一个数字。
ABS