+--------+---------+-----------+
| id | title | parent_id |
+--------+---------+-----------+
| 1 | Lvl-1 | null |
+--------+---------+-----------+
| 2 | Lvl-2 | null |
+--------+---------+-----------+
| 3 | Lvl-11 | 1 |
+--------+---------+-----------+
| 4 | Lvl-12 | 1 |
+--------+---------+-----------+
| 5 | Lvl-121 | 4 |
+--------+---------+-----------+
How do i actualy get root parent for each row
For example, row with id 5
have parent with id 4
and id 4
have parent with id 1
, so root id for id 5
is id 1
I dont have any idea on how to do it and is there a way to solve this by using only 1 query
RolandoMySQLDBA
You are simply not going to believe this
Here is a short query doing what you're asking, assuming your table is called foo
and that you want to know the root of <id>
:
SELECT f.id, f.title
FROM (
SELECT @id AS _id, (SELECT @id := parent_id FROM foo WHERE id = _id)
FROM (SELECT @id := <id>) tmp1
JOIN foo ON @id IS NOT NULL
) tmp2
JOIN foo f ON tmp2._id = f.id
WHERE f.parent_id IS NULL
If your tree structure is more than say two layers deep you're searching for modified preorder tree traversal
来源:https://stackoverflow.com/questions/8480095/getting-root-parent