我有以下資料庫表:Tag (id, parentId, name)。我想從一個 id(我的種子 id)開始,并獲取此標簽的所有父級及其所有前輩,直到到達 NULL 父級。
| id | parentId | name | | id | parentId | name |
| -- | -------- | ---- | | -- | -------- | ---- |
| 1 | null | tag1 | | 9 | 8 | tag9 |
| 2 | null | tag2 | ==>> | 8 | 7 | tag8 |
| 3 | 1 | tag3 | | 7 | 4 | tag7 |
| 4 | 2 | tag4 | | 4 | 2 | tag4 |
| 5 | 4 | tag5 | | 2 | null | tag2 |
| 6 | 4 | tag6 |
| 7 | 4 | tag7 |
| 8 | 7 | tag8 |
| 9 | 8 | tag9 |
我寫了這個 SQL,它只獲取一行。知道我做錯了什么嗎?
from (select * from tag order by parentId, id) tags_sorted, (select @var := '9') seed
where find_in_set(id, @var)
and length(@var := concat(@var, ',', parentId));
PS:我嘗試恢復該程序,并從父 ID 開始,然后獲取所有后繼者,并且相同的 SQL 查詢作業得非常好:
from (select * from tag order by parentId, id DESC) tags_sorted, (select @var := '2') seed
where find_in_set(parentId, @var)
and length(@var := concat(@var, ',', id));
uj5u.com熱心網友回復:
你需要排序parentId DESC(默認排序是ASC):
SELECT *
FROM (SELECT * FROM tag ORDER BY parentId DESC, id) tags_sorted, (SELECT @var := '9') AS seed
WHERE find_in_set(id, @var) AND length(@var := concat(@var, ',', parentId));
您正在查找樹,因此順序與向下查找的查詢相反。
更新
我認為通過這種方式可以獲得根節點(parentId 為空的節點):
SELECT *
FROM (SELECT * FROM tag ORDER BY parentId DESC, id ASC) tags_sorted, (SELECT @var := '9') AS seed
WHERE find_in_set(id, @var) AND length(@var := concat(@var, ',', coalesce(parentId, 0)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332690.html
標籤:mysql
下一篇:Mysql查詢執行速度非常慢
