MySQL按父/子和名称排序

MySQL按父/子和名称排序,mysql,Mysql,如何使用MySQL查询表中的信息,以返回表按类型名称和父类型排序的信息 作为一个例子,我想举一个这样的表格: +---------+-------------+------------+ | type_id | parent_type | type_name | +---------+-------------+------------+ | 1 | 0 | Type 1 | | 2 | 0 | Type B |

如何使用MySQL查询表中的信息,以返回表按类型名称和父类型排序的信息

作为一个例子,我想举一个这样的表格:

+---------+-------------+------------+
| type_id | parent_type | type_name  |
+---------+-------------+------------+
|       1 |           0 | Type 1     |
|       2 |           0 | Type B     |
|       3 |           0 | Type 3     |
|       4 |           3 | Sub Type 1 |
|       5 |           0 | Type 5     |
|       6 |           0 | Type 6     |
|       7 |           3 | Sub Type 2 |
|       8 |           0 | Type C     |
|       9 |           1 | Sub Type 1 |
+---------+-------------+------------+
然后使用查询将其拉出,如:

+---------+-------------+------------+
| type_id | parent_type | type_name  |
+---------+-------------+------------+
|       1 |           0 | Type 1     |
|       9 |           1 | Sub Type 1 |
|       3 |           0 | Type 3     |
|       4 |           3 | Sub Type 1 |
|       7 |           3 | Sub Type 2 |
|       5 |           0 | Type 5     |
|       6 |           0 | Type 6     |
|       2 |           0 | Type B     |
|       8 |           0 | Type C     |
+---------+-------------+------------+
基本上使子行位于父行之后,并按类型名称对父行排序

到目前为止,这是我通过这个查询所能得到的:

SELECT *
FROM `item_types` AS b 
ORDER BY
    CASE
        WHEN `parent_type` = 0
        THEN `type_id`
        ELSE `parent_type`
    END,
    type_name;

您有一个自引用表。。。所以你需要像这样的东西

select id, parent_id, name
  from (select type_id as id, type_id as parent_id, type_name as name
          from item_types
         where parent_type = 0
        UNION
        select type_id as id, parent_type as parent_id, type_name as name)
          from item_types
         where parent_type != 0)
 order by id, parent_id, name