2017-11-29 1 views
1

테이블이 있는데 SUBROW은 행의 ID (0이 아닌 경우)를 표시하고 행이 다른 행의 하위인지 여부를 나타냅니다."row-subrows"주문 선택 MYSQL 쿼리

ID | SUBROW 
1 | 0 
3 | 1 
5 | 1 
2 | 0 
4 | 2 

아이디어 :

ID | SUBROW 
1 | 0 
2 | 0 
3 | 1 
4 | 2 
5 | 1 

나는 쿼리, 다음과 같은 순서로 선택 할 필요가?

+0

같은 일부 mysql (틱) 기능을 사용할 필요가 없습니다 만약 부모의 ID 자녀의 때보 다 짧아 :'ORDER LEAST (ID, SUBROW) BY, ID'. 이것은 2 단계에서만 작동합니다. – Uueerdo

+0

감사. 수락 할 수 있도록 답변을 게시 할 수 있습니다. – Leeloo

답변

1

부모의 아이디가 항상 하위 아이보다 작은 것으로 가정하면 ORDER BY LEAST(ID, SUBROW), ID과 같은 것을 사용하여 부모의 순서에 따라 순서대로 정렬 할 수 있습니다.

... 실제로, 두 "층"(부모와 자녀, 아니 손자) 가정, 부모 ID는 차일보다 일 필요는 없습니다

ORDER BY IF(SUBROW = 0, ID, SUBROW), SUBROW <> 0, ID

또는

ORDER BY CASE WHEN SUBROW = 0 THEN ID ELSE SUBROW END, SUBROW <> 0, ID

먼저 부모 ID (해당하는 경우)로 주문한 다음 행에 부모가 있는지 여부를 확인한 다음 , ID은 순서를 보장하려는 경우에만 필요합니다. 아이들은 질의의 한 실행에서 다음 실행으로 바꿀 수 없다.

0
SELECT tmp.Id, 
tmp.SUBROW FROM (
SELECT d.Id, 
d.SUBROW, 
CASE WHEN d.SUBROW=0 THEN CAST(d.Id AS VARCHAR)+'00' 
ELSE 
CAST(d.SUBROW AS VARCHAR)+ CAST(d.Id AS VARCHAR) +'0' 
END lvl 
FROM data d) tmp 
ORDER BY tmp.lvl 

까다로운의 종류,하지만 LEAST