总和直到每个组的某一点 - mysql

时间:2010-09-02 20:27:43

标签: mysql sum

我有一个大约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

果树MySQL表

 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查询以获得结果? 我可能不得不写几个查询来做到这一点,但我只是不确定如何构建它。

谢谢

2 个答案:

答案 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

似乎对我有用,但我希望表现会很好。