MySql命令多列考虑多个

时间:2016-06-02 07:10:32

标签: mysql

  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_id1应该是id 1的旁边,并且如上所述排列,它清楚地表明p_id 1}} 1p_id 2分别位于id 12旁边,并确保id { {1}}按顺序,并在ID 7

旁边标识6

2 个答案:

答案 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