php - 起点和终点列表的基本非加权寻路

标签 php mysql

我正在制作一个旅游项目,但遇到了一个问题。我已经创建了一个数据库:

ID  Source   Destination

1     C1         C2
2     C3         c4
3     C3         C5
4     C4         C6
5     C8         C9
6     C2         C3

当我从 C1->C6 进行游览时,它应该遵循路径 c1->c2->c3->c4->c6。但是当通过查询检索时,到达 c3 时出现冲突:还有另一个 C3->c5。

如何克服这个问题?

首先,我通过检查 mysql 将 c1 作为源 由此,我通过该目的地获取目的地,并将其作为源检查相关目的地

最佳答案

尝试:

CREATE TABLE test (
  ID INTEGER NOT NULL,
  SOURCE CHAR(2) NOT NULL,
  DESTINATION CHAR(2) NOT NULL
);

INSERT INTO test VALUES (1, 'C1', 'C2');
INSERT INTO test VALUES (2, 'C3', 'C4');
INSERT INTO test VALUES (3, 'C3', 'C5');
INSERT INTO test VALUES (4, 'C4', 'C6');
INSERT INTO test VALUES (5, 'C8', 'C9');
INSERT INTO test VALUES (6, 'C2', 'C3');

然后:

SELECT
  CONCAT_WS(
    '->',
    A.SOURCE,
    A.DESTINATION,
    B.DESTINATION,
    C.DESTINATION,
    D.DESTINATION
  )
FROM test A
LEFT JOIN test B ON B.SOURCE = A.DESTINATION
LEFT JOIN test C ON C.SOURCE = B.DESTINATION
LEFT JOIN test D ON D.SOURCE = C.DESTINATION
WHERE
  A.SOURCE = 'C1'
  AND 'C6' IN (A.DESTINATION, B.DESTINATION, C.DESTINATION, D.DESTINATION);

这给出:

C1->C2->C3->C4->C6

请记住,此示例仅给出最大深度为 4 的路径,但您可以轻松扩展它。您还将获得所有可能的路径(如果有多个)。因此,您需要决定选择哪一个。

关于php - 起点和终点列表的基本非加权寻路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13578454/

相关文章:

php - 如何使用 PHP Laravel 合并数组?

javascript - 使用ajax将变量传递回页面

PHP 查找最小数字/日期的快捷方式

mysql - Laravel 抛出一般错误 : 1215 Cannot add foreign key constraint"when I create foreign keys

python - 启用Python通过SSH连接到MySQL

mysql - 持久异常 : ERROR executing DML bindLog[] error[Field 'id' doesn't have a default value]

php - DQL 与 JOIN Doctrine2 和 Symfony2

php - 当iframe嵌入式视频播放,暂停,缓冲时如何显示警报

php - 随机获取mysql数据库的值

mysql - 如何使用laravel在mysql中插入Lat和Lng到点类型列?