查询此mySQL表的总路径距离

时间:2013-01-11 16:17:12

标签: mysql distance

我有这个表,SQLFiddle here基于此图像path

CREATE TABLE Table1 (
`id` INT( 11 ),
`Segment` VARCHAR( 5 ),
`Distance` FLOAT( 5, 2 ),
`startX` FLOAT( 5, 2 ),
`startY` FLOAT( 5, 2 ),
`endX` FLOAT( 5, 2 ),
`endY` FLOAT( 5, 2 )
);
INSERT INTO Table1 
(`id`, `Segment`, `Distance`, `startX`, `startY`, `endX`, `endY`)
VALUES
(1, 'AB', 14.00, -20.00, -19.00, -34.00, -19.00),
(2, 'BC', 15.56, -9.00, -8.00, -20.00, -19.00),
(3, 'CD', 19.00, 10.00, -8.00, -9.00, -8.00),
(4, 'DE', 21.00, 10.00, -29.00, 10.00, -8.00),
(5, 'EF', 11.31, 18.00, -37.00, 10.00, -29.00),
(6, 'FG', 26.66, 42.00, -37.00, 18.00, -37.00),
(7, 'DH', 43.00, 53.00, -8.00, 10.00, -8.00),
(8, 'HI', 22.63, 69.00, -24.00, 53.00, -8.00),
(9, 'HJ', 13.00, 53.00, 5.00, 53.00, -8.00),
(10, 'JK', 14.14, 63.00, 15.00, 53.00, -5.00),
(11, 'KL', 21.00, 84.00, 15.00, 63.00, 15.00),
(12, 'LM', 14.14, 94.00, 25.00, 84.00, 15.00);
表中的

已经给出了每个段的长度,从段的开始xy和结束xy

问题#1,是否可以使用此表中的mysql进行查询,该查询将给出总路径距离,如果我想获得从A点到E点的路径距离将给出总距离AB + BC + CD + DE

感谢

4 个答案:

答案 0 :(得分:0)

您正在谈论迭代不同的可能性。虽然你可以在MySQL中做到这一点(可能通过某种程序或函数),但通常不会使用SQL来执行任务,通常在应用程序端完成。

如果点数不是很大(你的例子有13个),我只需要构建一个包含所有元组元素的表,然后查询你感兴趣的两个。

CREATE TABLE distances (
  point1 VARCHAR(1),
  point2 VARCHAR(1),
  distance FLOAT(5,2)
);

填写你的起点(你提供的所有1段)然后按照以下方式做点什么:

INSERT INTO distances (point1, point2, distance) 
SELECT
  p1.point1 as point1,
  p2.point2 as point2,
  p1.distance + p2.distance as distance
FROM
  distances p1
INNER JOIN distances p2
  ON p1.point2 = p2.point1

答案 1 :(得分:0)

SELECT SUM(distance) 
  FROM table1 a  
 WHERE a.segment IN ('AB','BC','CD','DE');

我希望您可以编写一些代码来动态构建IN字符串。

答案 2 :(得分:0)

我有理由相信,使用简单的SQL查询无法做到这一点。如果你的结构总是一棵树,你需要走从末端节点到根的路径,如果没有,你需要使用类似Djikstra算法的东西。两种解决方案都需要迭代过程,这是SQL无法实现的。您可以使用存储过程来完成它,但是您可能最好在您调用它的脚本中执行此操作。

答案 3 :(得分:-1)

我认为这就是你要找的东西。我正在使用Char操作根据两个输入确定路径的开始和结束。起点的第一个字符和结束点的第二个字符。

SELECT SUM(t.distance) FROM Table1 t
WHERE t.segment >= CONCAT('A',Char(ASCII('A')+1))
AND t.segment <= CONCAT(Char(ASCII('E')-1),'E')