【问题标题】:Querying the total Path distance from this mySQL table从这个 mySQL 表查询总路径距离
【发布时间】:2013-01-12 01:01:28
【问题描述】:

我有这张表,SQLFiddle here 来自这张图片

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

谢谢

【问题讨论】:

    标签: mysql distance


    【解决方案1】:

    您正在谈论迭代不同的可能性。虽然您可以在 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
    

    【讨论】:

      【解决方案2】:
      SELECT SUM(distance) 
        FROM table1 a  
       WHERE a.segment IN ('AB','BC','CD','DE');
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我认为这就是您要寻找的。我正在使用 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')
          

          【讨论】:

          • 这个解决方案是错误的。您可以通过另一个示例(例如 A 到 M)轻松验证这一点,在这种情况下,它将尝试包含所有不属于路径的段,例如 DE 和 FG。
          猜你喜欢
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多