0

我有这张表,这里的 SQLFiddle来自这张图片小路

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+德

谢谢

4

4 回答 4

0

我有理由确定用简单的 SQL 查询是不可能做到这一点的。如果您的结构始终是一棵树,则需要从末端节点到根节点的路径,如果不是,则需要使用 Djikstra 算法之类的东西。这两种解决方案都需要一个迭代过程,而 SQL 是不可能的。您可能可以使用存储过程来执行此操作,但您最好在调用它的脚本中执行此操作。

于 2013-01-11T17:01:28.333 回答
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
于 2013-01-11T16:30:16.897 回答
0
SELECT SUM(distance) 
  FROM table1 a  
 WHERE a.segment IN ('AB','BC','CD','DE');

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

于 2013-01-11T16:37:27.280 回答
-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')
于 2013-01-11T16:52:29.840 回答