我的数据库中有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
答案 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;