您的问题似乎与 ASC / DESC 修饰符有关。
但是既然我们在这里,你不喜欢使用距离公式吗?附近的东西
SELECT x, y FROM tile WHERE
(
POW(x-@var1, 2) + POW(y-@var2, 2) <= POW(3, 2)
)
ORDER BY x DESC, y ASC;
在这里,给定一个点 P (m,n),我们将通过 acerting 知道到固定点 Q (x,y) 的距离D(P,Q) = SQRT( (x-m)² + (y-n)² )
。尽管它必须小于(或等于)您所需的半径 (= 3),但我们有SQRT( (x-m)² + (y-n)² ) <= 3
或更好,(x-m)² + (y-n)² <= 3²
将这两项都提高到它的平方幂。
SQL 语言讲,我们写POW(x-m, 2) + POW(y-n, 2) <= POW(3, 2)
,愿意说和之间的距离(x,y)
是(m,n)
大于等于3
的。
关于@var
,这是您输入输入值的地方。更具体地说,它们是会话变量,但您并不想用它来执行选择;只需将它们替换为您想要的任何数字,例如,您可以(0,0)
通过放置0
and@var1
来选择原点@var2
。
[更新]
嗯......在回答之前测试你的代码总是一个好主意。事实上,我应该建议先按y
排序,因为我们首先关心要在屏幕上显示的排序行。以下代码(最终)经过测试(在test
DB 上);我的最后一个建议是创建以下索引(index_y_x):
USE `test` ;
CREATE TABLE IF NOT EXISTS `test`.`tile` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
`x` INT(11) NULL DEFAULT 0 ,
`y` INT(11) NULL DEFAULT 0 ,
PRIMARY KEY (`id`) ,
INDEX `index_y_x` (`y` DESC, `x` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
INSERT tile (x,y) VALUES
(-2,-2),(-2, -1),(-2, 0),(-2, 1),(-2, 2),
(-1,-2),(-1, -1),(-1, 0),(-1, 1),(-1, 2),
(0,-2), (0, -1), (0, 0), (0, 1), (0, 2),
(1,-2), (1, -1), (1, 0), (1, 1), (1, 2),
(2,-2), (2, -1), (2, 0), (2, 1), (2, 2);
SELECT x, y FROM tile
WHERE POW(x-3, 2) + POW(y-3, 2) <= POW(3, 2)
ORDER BY y DESC, x ASC;
这将返回点 (3,3) 附近的项目,范围为 3 个单位