这是我目前的sql:
SELECT * FROM items
WHERE trumped = 1
ORDER BY ABS( `value` - 12110433 )
limit 3
这会正确返回具有最接近值的行: 12313672 。但是,我需要能够拉出最接近的较低数值。 (最接近12110433的数字)
我已经尝试使用top 1
的方法,但这对我来说错误,所以我无法使用它。
我还需要经常快速地运行它,它会对我的数据库造成负担吗?
谢谢
答案 0 :(得分:2)
最有效的方法是:
SELECT i.*
FROM items i
WHERE i.trumped = 1 AND value < 12110433
ORDER BY value DESC
LIMIT 1;
为了提高性能,您需要items(trumped, value)
上的索引。
答案 1 :(得分:1)
使用union all
进行此操作的一种方法。
(SELECT * FROM items
WHERE trumped = 1 AND `value`>=12110433
ORDER BY `value`-12110433
limit 1)
UNION ALL
(SELECT * FROM items
WHERE trumped = 1 AND `value`<12110433
ORDER BY 12110433-`value`
limit 1)
如果您使用的是MariaDB版本10.2及更高版本,则可以使用row_number
功能实现此目的。
select *
from (select i.*,
row_number() over(order by case when 12110433-`value`<0 then 1 else 0 end,`value`) as rnum_above,
row_number() over(order by case when 12110433-`value`>0 then 1 else 0 end,`value`) as rnum_below
from items i
) t
where 1 in (rnum_below,rnum_above)