我有一个大约1000行的MySQL表,里面装满了不同类型的果树及其在农场的位置。数据如下所示:
7 |
6 | G G
5 | G
Y 4 | G G
3 | A X G G
2 | A A A
1 |_ _ _ _ _ _ _
1 2 3 4 5 6 7
X
ID Type X Y
-- ---- -- --
1 Apple 3 2
2 Grape 3 4
3 Grape 3 5
4 Grape 3 6
5 Apple 4 2
6 Apple 4 3
7 Grape 4 6
8 Apple 5 2
9 Grape 5 4
10 Grape 6 3
11 Grape 7 3
现在,我正在查询此表,以获取距离中心X(5,3)的每种类型最近的“3”树。
查询结果应返回如下内容:
ID Type X Y
-- ---- -- --
6 Apple 4 3
5 Apple 4 2
8 Apple 5 2
9 Grape 5 4
10 Grape 6 3
11 Grape 7 3
可能有几棵树距离中心的距离相同,但这并不重要,因为一旦最近的树木(3)的最大数量满足,那么我们将不再包括来自该类型树木的树木。希望这是有道理的。
要获得从中心X到附近树的距离,我使用以下公式:
Distance = SQRT( POW(ABS(5 - X),2) + POW(ABS(3 - Y),2) )
以下是我一直在尝试使用的参考: Sum until certain point - MySql
如何编写MySQL查询以获得结果? 我可能不得不写几个查询来做到这一点,但我只是不确定如何构建它。
谢谢
答案 0 :(得分:1)
也许这个?
select id, type, x, y
from fruit_trees as ft1
where not exists (
select null
from fruit_trees as ft2
where
ft2.type = ft1.type and
ft2.distance <= ft1.distance
limit 3, 1
)
编辑:最好试试这个:
select id, type, x, y
from fruit_trees as ft1
where id in (
select id
from fruit_trees as ft2
where
ft2.type = ft1.type
order by ft2.distance
limit 3
)
我目前没有可用的MySQL,所以我无法测试该查询。
答案 1 :(得分:1)
您可以使用variables模拟行号。
SELECT @i:=0, @type:=''
;
SELECT
id, type, x, y
FROM (
SELECT
id, type, x, y
, SQRT( POW(ABS(5 - x),2) + POW(ABS(3 - y),2) ) AS distance
, IF( type=@type, @i:=@i+1, @i:=0 ) AS rank
, IF( type=@type, @type, @type:=type ) AS new_type
FROM
fruit_trees
ORDER BY
type
, distance
) x
WHERE
rank < 3
似乎对我有用,但我希望表现会很好。