konakona
在MYSQL中选择相邻的值
在MYSQL中选择相邻的值

今天公司的项目里需要选择某个值附近的若干个相邻的值,比如相邻的日期等等。我们怎样在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)

赞赏
没有标签
首页      程序开发      SQL      在MYSQL中选择相邻的值
https://secure.gravatar.com/avatar/3b712b34a0e1b689cfb524c9c6bcdc47?s=256&r=g

团哥

文章作者

继续玩我的CODE,让别人说去。 低调,就是这么自信。

发表评论

textsms
account_circle
email


Notice: wp_add_inline_script的调用方法不正确。不要传递<script>标签给wp_add_inline_script()。 请查阅调试WordPress来获取更多信息。 (这个消息是在4.5.0版本添加的。) in /data/wwwroot/crazyphper/blog/wp-includes/functions.php on line 4667

konakona

在MYSQL中选择相邻的值
今天公司的项目里需要选择某个值附近的若干个相邻的值,比如相邻的日期等等。我们怎样在MYSQL中实现这种功能呢? 我们可以简单的使用 ORDER bY语句,我们希望选择和指定值最相近的某些…
扫描二维码继续阅读
2009-11-30