Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting root parent

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

like image 644
slier Avatar asked Dec 12 '11 19:12

slier


2 Answers

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
like image 119
Magnar Myrtveit Avatar answered Sep 22 '22 16:09

Magnar Myrtveit


You are simply not going to believe this

I wrote a post in the DBA StackExchange (October 24, 2011) on how to pull this off using Stored Procedure programming. I also included some sample data and the results.

like image 29
RolandoMySQLDBA Avatar answered Sep 25 '22 16:09

RolandoMySQLDBA