今天公司的项目里需要选择某个值附近的若干个相邻的值,比如相邻的日期等等。我们怎样在MYSQL中实现这种功能呢?
我们可以简单的使用 ORDER bY语句,我们希望选择和指定值最相近的某些值。包括大于和小于指定值。
具体说一下,我们需要从一个表中选择6列值,与2500 最相近的:
我们可以使用如下语句:
SELECT number, ABS( number - 2500 ) AS distance
FROM numbers
ORDER BY distance
LIMIT 6
返回:
number distance
2502 2
2494 6
2508 8
2489 11
2513 13
2487 13
(6 total, Query took 2.2792 sec)
我们可以看到以上从2百万数据中查询耗时大约2秒。我们能否以更快的数据来进行查询能?
我们可以首先在MySQL的限制范围内的数字来计算它的距离。因为我们只要查询返回6个数值,我们可以肯定所得结果肯定是在小于2500的6个数值以及大于2500的6个数值之间。
因此我们其实只要取得这个数值附近的13个值,就可以第一步缩小MYSQL的查询范围了。
使用union 语句来实现:
(
SELECT number
FROM `numbers`
WHERE number >=2500
ORDER BY number
LIMIT 7
) UNION ALL (
SELECT number
FROM `numbers`
WHERE number <2500
ORDER BY number DESC
LIMIT 6
)
第一个联合,由于包含2500 所以需要在LIMIT 6+1
接下来从以上结果取得最接近的6列
SELECT number, ABS( number - 2500 ) AS distance FROM (
(
SELECT number
FROM `numbers`
WHERE number >=2500
ORDER BY number
LIMIT 6
) UNION ALL (
SELECT number
FROM `numbers`
WHERE number <2500
ORDER BY number DESC
LIMIT 6
)
) AS n
ORDER BY distance
LIMIT 6
同样返回上面的结果:
number distance
2502 2
2494 6
2508 8
2489 11
2513 13
2487 13
(6 total, Query took 0.0011 sec)
发表回复