mysql match get record,其中列值接近其他列(低于阈值)

qjp7pelc  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(347)

我有以下坐标记录

我想要的是,把所有的记录拿到哪里 z1 与任何其他记录的差异小于4(基本要求)
这意味着在上表中,最后两条记录的差值小于4,然后我想在查询中获取它们。
如果有新的记录 z1 = 808 存在,则应返回此记录和id为28478的记录,因为它们的差值小于4。
有什么方法可以在mysql中实现这一点吗?
或者php,不用说那么久就可以做到?
编辑:以下是数据:

+-------+-------+-------+-------+-------+
|  id   |  x1   |  x2   |  z1   |  z2   |
+-------+-------+-------+-------+-------+
| 28478 | -1500 | -1496 |   804 |   808 |
| 29929 | -1500 | -1496 |  1444 |  1448 |
| 30051 | -1500 | -1496 | -1168 | -1164 |
| 30346 | -1500 | -1496 |  -336 |  -332 |
| 28039 | -1496 | -1492 | -1128 | -1124 |
| 28969 | -1496 | -1492 | -1424 | -1420 |
| 29265 | -1496 | -1492 |  -520 |  -516 |
| 29872 | -1496 | -1492 |  1288 |  1292 |
| 30122 | -1496 | -1492 |  -932 |  -928 |
| 30846 | -1496 | -1492 |  1376 |  1204 |
| 30898 | -1496 | -1492 |  1380 |  1384 |
+-------+-------+-------+-------+-------+

我试过了

select *
from coordinates t
where 
    x1 between -1500 and -1500 + 4
  and exists (
        select 1
        from coordinates t1
        where t1.id <> t.id
          and abs(t1.z1 - t.z1) <= 4);

但没用。

new9mtju

new9mtju1#

你可以用 exists :

select t.*
from mytable t
where exists (
    select 1 
    from mytable t1
    where t1.id <> t.id and abs(t1.z1 - t.z1) <= 4
)

不使用可能更有效 abs() :

select t.*
from mytable t
where exists (
    select 1 
    from mytable t1
    where t1.id <> t.id and t1.z1 - t.z1 between -4 and 4
)

db fiddle上的演示-两个查询都产生:

id |    x1 |    x2 |   z1 |   z2
----: | ----: | ----: | ---: | ---:
30846 | -1496 | -1492 | 1376 | 1204
30898 | -1496 | -1492 | 1380 | 1384

相关问题