按多列排序行选择

时间:2011-02-21 15:19:26

标签: 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

如何选择这只猫按idparentid排序?那是

CatOne 1
--SubCatOne 4
--SubCatOne2 5
CatTwo 2
CatThree 3
--SubCatThree 6

5 个答案:

答案 0 :(得分:5)

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

select * from  cats
order by
      case when parentid = 0 then id else parentid end,
      case when parentid = 0 then 0 else id end

更新以包括父母与子女孩相比具有更高身份的时间

答案 1 :(得分: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

FIRST case / when的顺序将所有项目置于顶级,或者将初级级别的ID置于次级别。因此,如果您有超过1000个条目,尝试使用提供的父* 1000样本黑客将不会成为问题。 SECOND案例/何时将强制当父ID = 0到其分组列表的TOP及其所有子条目在其下,但在下一个父ID之前。

但是,如果你想要双短划线,请改为

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

答案 2 :(得分:1)

如果你要排序:ORDER BY parentid,id

那么你会得到你正在寻找的订单,但它不是有意或无意的,就像你的例子一样。

SQL可能不是那种做缩进组的最佳媒介。你可以......但是在你的前端应用程序中做得更好

编辑:对不起误读的问题,Eric Petroelje说的话。

编辑编辑:或从表中选择,加入自身,(一个用于Cat,一个用于SubCat),然后指定不同的顺序,每个表中有一个。

答案 3 :(得分:1)

这:

select id as parentId,
0 as sortOrder,
id,
name
from cats 
where parentId = 0
union all
select parentId,
1 as sortOrder,
id,
name
from cats 
where parentId > 0
order by parentId, sortOrder, name

返回:

ParentId sortOrder  id   Name
    1       0       1   CatOne
    1       1       4   SubCatOne
    1       1       5   SubCatOne2
    2       0       2   CatTwo
    3       0       3   CatThree
    3       1       6   SubCatThree

答案 4 :(得分:0)

你可以试试这个。它不是您指定的格式,但它是否符合您的要求?

SELECT c.id,c.name,sc.id as subcatid,sc.name as subcatname
FROM cats c LEFT JOIN cats sc ON c.id=sc.parentid
WHERE c.parentid=0 order by c.id,sc.id;

它产生以下内容:

+------+----------+----------+-------------+
| id   | name     | subcatid | subcatname  |
+------+----------+----------+-------------+
|    1 | CatOne   |        4 | SubCatOne   |
|    1 | CatOne   |        5 | SubCatOne2  |
|    2 | CatTwo   |     NULL | NULL        |
|    3 | CatThree |        6 | SubCatThree |
+------+----------+----------+-------------+