MySql: ORDER BY parent and child

前端 未结 3 474
情话喂你
情话喂你 2020-12-23 17:53

I have a table like:

+------+---------+-
| id   | parent  |
+------+---------+
| 2043 |    NULL |
| 2044 |    2043 |
| 2045 |    2043 |
| 2049 |    2043 |
|          


        
相关标签:
3条回答
  • 2020-12-23 18:17

    The solution above didn't work for me, my table used 0 instead of NULL. I found this other solution: you create a column with the concatened parent id and child id in your query and you can sort the result by it .

    SELECT CONCAT(IF(parent = 0,'',CONCAT('/',parent)),'/',id) AS gen_order
    FROM table 
    ORDER BY gen_order
    
    0 讨论(0)
  • 2020-12-23 18:20

    Including sorting children by id:

    ORDER BY COALESCE(parent, id), parent IS NOT NULL, id
    

    SQL Fiddle example

    Explanation:

    • COALESCE(parent, id): First sort by (effectively grouping together) the parent's id.
    • parent IS NOT NULL: Put the parent row on top of the group
    • id: Finally sort all the children (same parent, and parent is not null)
    0 讨论(0)
  • 2020-12-23 18:36

    If your table uses 0 instead of null to indicate an entry with no parent:

    id   | parent
    -------------
    1233 | 0
    1234 | 1233
    1235 | 0
    1236 | 1233
    1237 | 1235
    

    Use greatest instead of coalesce and check the value does not equal 0:

    ORDER BY GREATEST(parent, id), parent != 0, id
    
    0 讨论(0)
提交回复
热议问题