按多列排序行选择

Isi*_*sis 5 mysql sql select sql-order-by

我有一个数据库

id    |     parentid     |       name
1     |        0         |      CatOne
2     |        0         |      CatTwo
3     |        0         |      CatThree
4     |        1         |      SubCatOne
5     |        1         |      SubCatOne2
6     |        3         |      SubCatThree
Run Code Online (Sandbox Code Playgroud)

我怎样才能选择该猫排序id,parentid?那是

CatOne 1
--SubCatOne 4
--SubCatOne2 5
CatTwo 2
CatThree 3
--SubCatThree 6
Run Code Online (Sandbox Code Playgroud)

Kri*_*nov 5

假设你的桌子被命名为猫,试试这个:

select * from  cats
order by
      case when parentid = 0 then id else parentid end,
      case when parentid = 0 then 0 else id end
Run Code Online (Sandbox Code Playgroud)

更新以包括父项与子项相比具有更高ID的时间


DRa*_*app 3

这应该可以做到...除了名称的双破折号“--”前缀...

SELECT 
      t1.name,
      t1.id
   FROM 
      Table1 t1
   ORDER BY 
      case when t1.parentID = 0 then t1.ID else t1.ParentID end,
      case when t1.parentID = 0 then '1' else '2' end,
      t1.id
Run Code Online (Sandbox Code Playgroud)

按第一个情况/时间的顺序将所有属于顶级的项目或按照主要级别的 ID 置于次要级别的项目。因此,如果您有超过 1000 个条目,尝试使用提供的父 * 1000 个示例 hack 不会有问题。第二个情况/时间将在父 ID = 0 时强制到其分组列表的顶部及其下方的所有子条目,但在下一个父 ID 之前。

但是,如果您确实想要双破折号,请更改为

SELECT 
      if( t1.ParentID = 0, '', '--' ) + t1.name name,
     <rest of query is the same>
Run Code Online (Sandbox Code Playgroud)