我有一个数据库
id | parentid | name
1 | 0 | CatOne
2 | 0 | CatTwo
3 | 0 | CatThree
4 | 1 | SubCatOne
5 | 1 | SubCatOne2
6 | 3 | SubCatThree
如何选择这只猫按id
,parentid
排序?那是
CatOne 1
--SubCatOne 4
--SubCatOne2 5
CatTwo 2
CatThree 3
--SubCatThree 6
答案 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 |
+------+----------+----------+-------------+