根据一个查询中的当前行字段选择下一行

时间:2017-07-05 07:26:42

标签: mysql

假设该表包含一个航点列表。

 id | nextID
----+--------
  1 |      2 
  2 |      4
  3 |      5
  4 |      1
  5 |      0

基于此表,我们有两个路径

  • 通函(1 - 2 - 4 - 1)
  • 线性(3 - 5)

如何查询表格以获得这些结果:

      When starting ID = 1
 id | nextID
----+--------
  1 |      2 
  2 |      4
  4 |      1

      When starting ID = 3
 id | nextID
----+--------
  3 |      5
  5 |      0

2 个答案:

答案 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;

<强>输出

enter image description here

MySQL 8 将在future中支持此功能。但您可以按照blog post

实现自己的实现

希望这会对你有所帮助。如果您需要进一步澄清,请告诉我。