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

Diese oben ist Datentabelle ist, wenn iMySql, um mehrere Spalten betrachten mehrere

SELECT * from tablename order by `id` asc 

geben wird es das obige Ergebnis

gesetzt

bringen Aber mein Anwendungsfall ist i von beiden zu sortieren brauchen die ID und p_id in einer anderen Art und Weise (dh) ich muss Ergebnis durch wie unter

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

lassen Sie mich kurz erklären, fertig dass p_id Wert 1 die neben dem id1 sein sollte und dass wie oben angeordnet ist, zeigen deutlich, dass p_id1 und p_id2 zum id1 und 2 jeweils nächsten ist und stellen Sie sicher, dass id7 um und id 6 nächste zu ID 7

+3

mehr Erklären Sie das Kriterium – 1000111

+0

@ 1000111 der Sortierung i jetzt deutlich –

+0

Hallo erklärt mit i erklärt nun ordentlich Beschreibung –

Antwort

1

Wenn ich Sie richtig verstanden habe, möchten Sie die Bestellung zu sein -> Wenn P_id=0 dann durch ID bestellen, sonst bestellen Sie durch p_id.

Sie können dies durch bedingte Bestellung erreichen CASE EXPRESSION mit:

SELECT * 
FROM YourTable t 
ORDER BY CASE WHEN t.pid = 0 
       THEN t.id 
       ELSE t.p_id 
     END ASC, 
     t.id 

Dies sollten Sie Ihre erwarteten Ergebnisse zurück.

+0

Vielen Dank für die schnelle Antwort, aber es schlägt fehl, wenn id 2 ist und dann entsprechende p_id ist 4 –

+0

Ich verstehe nicht, diese Abfrage sollte die gleichen Ergebnisse wie in Ihrem Beispiel ausgeben. , '2,4' wird nach' 2,0' bestellt @SelvaGanapathi – sagi

+0

ja es ist für diese Verwendung zufrieden, aber es scheitert für die '6,7', sollte es nach der' 7,1' präsentieren. @ sagi –

0

Sie müssen die Beziehung zwischen den IDs wissen und da die 2 ID-Blöcke unterschiedliche Sortieranforderungen haben, benötigen Sie auch eine Hilfespalte und eine Unterabfrage.

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 

Ergebnis

id pid 
1 0 
3 1 
7 1 
6 7 
2 0 
4 2 
5 0 
8 0 
+0

dies wird laks ID in dieser Tabelle haben und ich kann statische Nummer geben –

+0

Dachte nicht, dass Sie könnten, aber die Sortierkriterien für die 2 zu wiederholen ID-Blöcke sind unterschiedlich. Ohne eine Beziehung zwischen IDs in ID-Blöcken, glaube ich nicht, dass Ihre Anforderung erreichbar ist. –