数据库中最近的自由坐标

时间:2016-01-16 15:48:24

标签: mysql sql coordinates

我的数据库中有X和Z坐标。坐标是INTegers。

每个坐标大于或等于0。

我需要将最接近的自由(不是数据库)坐标设为0; 0但我不想将一个坐标限制为指定的数字。

同样,我不想在数据库中获得最近的坐标,我想得到最近的自由坐标。

这就是我自己做的。但它只告诉我坐标平方中的自由空间在哪里(受数据库中最大X和最大Z坐标的限制)。

问题是我无法从中选择自由坐标。我只获得自由坐标的距离,而不是坐标。

SELECT distance
FROM (
    SELECT (x+z) AS distance,COUNT(owner) AS count
    FROM coordinates 
    GROUP BY x+z ASC
) AS coor
WHERE coor.distance != coor.count-1

2 个答案:

答案 0 :(得分:2)

我尝试这样的事情:

select x, z
from (
    select x, z+1 as z from coordinates union all
    select x+1, z from coordinates union all
    select x+1, z+1 from coordinates union all
    select 0, 0
) as q
where
    concat(x,'_',z) not in (select concat(x,'_',z) from coordinates)
order by (x+z) asc
limit 1

答案 1 :(得分:2)

最大的问题是您正在处理稀疏表,即,当坐标空闲时,您没有任何数据。如果你有一个“free”标志设置为true的元组,你可以这样做

SELECT x, z FROM coordinates WHERE flagFree ORDER BY (x*x+z*z) LIMIT 1;

但要做到这一点,你需要maximumX * maximumZ记录。

要在实际没有数据时查找数据,您需要左/右连接。

这样做的一种方法是准备两个表,其中包含从0到最大X的数字以及从0到最大Y的数字。此时,

 SELECT coordinates.* from maxx JOIN maxz 
      LEFT JOIN coordinates ON ( ix = x AND iz = z );

将为所有缺失的坐标产生NULL。所以:

 SELECT ix, iz from maxx JOIN maxz 
      LEFT JOIN coordinates ON ( ix = x AND iz = z )
      WHERE x IS NULL AND z IS NULL
      ORDER BY ix*ix + iz*iz
 LIMIT 1;

将为您提供所需的坐标。

借用Lashane的解决方案,你可以在没有其他表的情况下做同样的事情,推断你找到原点的任何最近空单元格将是原点本身(0,0)或与另一个相邻充满细胞。填充的细胞在坐标中。所以:

SELECT p.x, p.z FROM ( 
    SELECT 0 AS x, 0 AS z 
    UNION
    SELECT x+1, z FROM coordinates
    UNION
    SELECT x+1, z+1 FROM coordinates
    UNION
    SELECT x, z+1 FROM coordinates
) AS p 
LEFT JOIN coordinates AS a ON (p.x = a.x AND p.z = a.z)
WHERE a.x IS NULL AND a.z IS NULL
ORDER BY p.z*p.z + p.x*p.x
LIMIT 1;