id | p_id
--------------------------
1 | 0
2 | 0
3 | 1
4 | 2
5 | 0
6 | 7
7 | 1
8 | 0
如果我给出
,这是表格数据的上方SELECT * from tablename order by `id` asc
它将带来上述结果集
但是我的用例是我需要以不同的方式对id和p_id进行排序(即)我需要得到如下所示的结果
id | p_id
--------------------------
1 | 0
3 | 1
7 | 1
6 | 7
2 | 0
4 | 2
5 | 0
8 | 0
让我简单解释一下,p_id
值1
应该是id
1
的旁边,并且如上所述排列,它清楚地表明p_id
1}} 1
和p_id
2
分别位于id
1
和2
旁边,并确保id
{ {1}}按顺序,并在ID 7
6
答案 0 :(得分:1)
如果我理解正确,您希望订单为 - >如果P_id=0
然后按ID
排序,则按p_id排序。
您可以使用CASE EXPRESSION
:
SELECT *
FROM YourTable t
ORDER BY CASE WHEN t.pid = 0
THEN t.id
ELSE t.p_id
END ASC,
t.id
这应该会返回您的预期结果。
答案 1 :(得分:0)
你需要知道id之间的关系,因为2个id块有不同的排序要求,你还需要一个辅助列和一个子查询。
create table t (id int, pid int)
insert into t
values
( 1 , 0),
( 2 , 0),
( 3 , 1),
( 4 , 2),
( 5 , 0),
( 6 , 7),
( 7 , 1),
( 8 , 0)
select s.id,s.pid
from
(
select case
when t.id in (1,3,7,6) then 1
else 2
end as ac
,
case
when t.id in (1,3,7,6) then pid
else id
end as sortcol
,
t.*
from t
) s
order by s.ac,s.sortcol
结果
id pid
1 0
3 1
7 1
6 7
2 0
4 2
5 0
8 0