테이블이 있는데 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
나는 쿼리, 다음과 같은 순서로 선택 할 필요가?
테이블이 있는데 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
나는 쿼리, 다음과 같은 순서로 선택 할 필요가?
부모의 아이디가 항상 하위 아이보다 작은 것으로 가정하면 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
은 순서를 보장하려는 경우에만 필요합니다. 아이들은 질의의 한 실행에서 다음 실행으로 바꿀 수 없다.
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
같은 일부
mysql
(틱) 기능을 사용할 필요가 없습니다 만약 부모의 ID 자녀의 때보 다 짧아 :'ORDER LEAST (ID, SUBROW) BY, ID'. 이것은 2 단계에서만 작동합니다. – Uueerdo감사. 수락 할 수 있도록 답변을 게시 할 수 있습니다. – Leeloo