2017-07-05 70 views
1

假設該表包含航點列表。根據一個查詢中的當前行字段選擇下一行

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

在此基礎上表中,我們有兩個pathes

  • 通函(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 
+0

因此,保持循環,直到您達到結果中已存在的值或0? – Strawberry

+0

@Strawberry我假設你的評論是基於我首先獲得表中所有行的想法,但我不是。我很好奇執行單個'SELECT'查詢來獲得這些結果。 – lolbas

+0

你不能。圓形部分是程序性的 – Strawberry

回答

1

For線性問題,你可以做到這一點。請注意,我用零而不是零孤兒...

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

不幸的是,這個解決方案僅將concat限制爲3個項目。然而一個有趣的解決方法! – lolbas

+0

更多LEFT JOINs =更多項目。我認爲你已經開始看到這種模式的侷限性。 – Strawberry

1

你試圖實現什麼叫做hierarchical query

分層查詢是在分層數據其中 父子關係被存儲在同一個表操作。

甲骨文DB2Postgres的有特殊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來實現你自己的。

希望這可以幫助你。如果你需要進一步澄清,請給我打電話。

相關問題