Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql匹配获取列值接近其他列的记录(低于阈值)_Php_Mysql_Sql_Algorithm_Select - Fatal编程技术网

Php MySql匹配获取列值接近其他列的记录(低于阈值)

Php MySql匹配获取列值接近其他列的记录(低于阈值),php,mysql,sql,algorithm,select,Php,Mysql,Sql,Algorithm,Select,我有以下坐标记录 我想要的是,得到所有记录,其中z1与任何其他记录的差异小于4阈值 这意味着在上表中,最后两条记录的差值小于4,那么我想在查询中得到它们 另外,如果存在z1=808的新记录,则应返回此记录和id为28478的记录,因为它们之间的差值小于4 有什么方法可以在MySql中实现这一点吗 或者PHP,不用说那么长时间就可以做到 编辑: 以下是数据: +-------+-------+-------+-------+-------+ | id | x1 | x2 | z

我有以下坐标记录

我想要的是,得到所有记录,其中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);
但不起作用。

您可以使用exists:

-两个查询都产生:

id | x1 | x2 | z1 | z2 ----: | ----: | ----: | ---: | ---: 30846 | -1496 | -1492 | 1376 | 1204 30898 | -1496 | -1492 | 1380 | 1384
看,我试过了,但没有成功,我已经编辑了我的问题,插入了数据和查询,你能检查一下吗?请解释一下你说的不成功是什么意思。我用您的示例数据在我的答案中添加了一个副词:查询确实返回了所需的结果。好的,我解决了问题,我应该在查询和子查询中添加-1500和-1500+4之间的x1,如下所示:从坐标t中选择t.*,其中x1介于-1500和-1500+4之间,存在从坐标t1中选择1,其中x1介于-1500和-1500+4之间,t1.id t.id和abs1.z1-t.z1
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
)
id | x1 | x2 | z1 | z2 ----: | ----: | ----: | ---: | ---: 30846 | -1496 | -1492 | 1376 | 1204 30898 | -1496 | -1492 | 1380 | 1384