I’m using Laravel (and MySQL of course) to build a pages module, a page can have 1 parent
This is my current data, and using order_by="id"
it’s also returned like this.
+----+-----------+ | id | parent_id | +----+-----------+ | 1 | NULL | | 2 | NULL | | 3 | 1 | | 4 | 1 | +----+-----------+
Now I’m wondering if it’s possible to have a result set where the children are ordered underneath their parent. Which would render the following result
+----+-----------+ | id | parent_id | +----+-----------+ | 1 | NULL | | 3 | 1 | | 4 | 1 | | 2 | NULL | +----+-----------+
Thoughts
Maybe it is possible to generate an order_by query that orders by id, but assigns a temporary id in a temp column, in between the others, in case the row has a parent_id?
So ideally the 2 children (3, 4) of the parent (1) are shown just below it.
Advertisement
Answer
You can use coalesce
function:
ORDER BY coalesce(`parent_id`,`id`),`parent_id` is not null
P.S. ,parent_id is not null
is needed for the case even (2,1)
inserted instead of (2,null)
in the order of VALUES(2,1),(1,null),(3,1),(4,1)
(special thanks to @splash58)