假设该表包含一个航点列表。
id | nextID
----+--------
1 | 2
2 | 4
3 | 5
4 | 1
5 | 0
基于此表,我们有两个路径
如何查询表格以获得这些结果:
When starting ID = 1
id | nextID
----+--------
1 | 2
2 | 4
4 | 1
When starting ID = 3
id | nextID
----+--------
3 | 5
5 | 0
答案 0 :(得分:1)
对于线性问题,您可以这样做。请注意,我为孤儿使用了NULL而不是0 ...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT PRIMARY KEY
,nextID INT NULL
);
INSERT INTO my_table VALUES
(1,2),
(2,4),
(3,5),
(4,1),
(5,NULL);
SELECT CONCAT_WS(',',a.id,b.id,c.id) path
FROM my_table a
LEFT
JOIN my_table b
ON b.nextID = a.id
LEFT
JOIN my_table c
ON c.nextID = b.id
WHERE a.nextID IS NULL;
+------+
| path |
+------+
| 5,3 |
+------+
答案 1 :(得分:1)
您要实现的目标称为hierarchical query。
分层查询在分层数据上运行 父子关系存储在同一个表中。
Oracle , DB2 , Postgres 有特殊syntaxes来查询分层数据。
在 Oracle 中如果要从起点找到所有可能的路径,则必须使用START WITH CONNECT BY
查询。
<强>查询强>
SELECT id "start_point", CONNECT_BY_ISCYCLE "Cycle",
LEVEL, SYS_CONNECT_BY_PATH(id, '/') "Path"
FROM waypoints START WITH id = 1
CONNECT BY NOCYCLE PRIOR next_id = id AND LEVEL <= 4;
<强>输出强>
MySQL 8 将在future中支持此功能。但您可以按照blog post。
实现自己的实现希望这会对你有所帮助。如果您需要进一步澄清,请告诉我。