2016-06-02 2 views
0
id | p_id 
-------------------------- 
    1 | 0 
    2 | 0  
    3 | 1   
    4 | 2 
    5 | 0 
    6 | 7  
    7 | 1   
    8 | 0 

Это выше данные таблицы, если я датьMySql порядка рассмотрим множественный

SELECT * from tablename order by `id` asc 

это принесет выше результирующий набор

Но мой случай использования мне нужно сортировать и идентификатор и P_ID другим способом (то есть) мне нужно, чтобы получить результат, установленный, как показано ниже

  id | p_id 
    -------------------------- 
      1 | 0 
      3 | 1  
      7 | 1 
      6 | 7 
      2 | 0 
      4 | 2 
      5 | 0   
      8 | 0 

позвольте мне кратко рассказать о что p_id значение 1 должно быть рядом с id1 и что устроено, как и выше, ясно показывают, что p_id1 и p_id2 находится рядом с id1 и 2 соответственно, и убедитесь, что id7 в порядке и идентификатор 6 рядом до id 7

+3

Объясните более критерий сортировки – 1000111

+0

@ 1000111 я теперь ясно объяснил –

+0

Привет я объяснена теперь с аккуратным описанием –

ответ

1

Если я правильно вас понял, вы хотите, чтобы заказ был -> If 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 

Это должно вернуть вам ваши ожидаемые результаты.

+0

Благодарим вас за быстрый ответ, но он не работает, когда id равен 2, а затем соответствующий p_id равен 4 –

+0

. Я не понимаю, этот запрос должен выводить те же результаты, что и в вашем примере. , '2,4' будет заказано после' 2,0' @SelvaGanapathi – sagi

+0

да, он удовлетворен за это использование, но он терпит неудачу для '6,7', он должен присутствовать после' 7,1'. @sagi –

0

Вам нужно знать взаимосвязь между идентификаторами и, поскольку два блока 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 
+0

, это будет иметь laks id в этой таблице, и я не могу дать статический номер –

+0

Не думал, что вы могли бы, но повторить критерии сортировки для 2 Блоки id различны. Без отношения между идентификаторами в блоках id, я не считаю, что ваше требование является достижимым. –

Смежные вопросы