2017-01-18 1 views
1

구체화 된 경로를 사용하여 SQl에 트리 구조를 저장하고 있습니다 (필자의 경우 MySQL 5.7). 슬래시로 구분 된 슬러그로 경로를 저장합니다. 필자가 읽은 모든 자습서에서는 경로를 기준으로 행을 정렬하여 올바른 순서로 추출하지만 경로의 일부분이 비슷한 접두어를 사용하는 경우 작동하지 않는 것으로 나타났습니다.SQL에서 구체화 된 경로를 올바르게 정렬하려면 어떻게합니까?

일부 예제 코드 : 이제

CREATE TABLE categories (
    id int(11), 
    parent_id int(11) DEFAULT NULL, 
    slug varchar(255), 
    path varchar(255) 
); 

INSERT INTO categories VALUES 
    (1, null, 'foo', '/foo'), 
    (2, 1, 'bar', '/foo/bar'), 
    (3, null, 'foo-it', '/foo-it'), 
    (4, 3, 'boy', '/foo-it/boy'); 

, 경로 정렬 할 때 내가 잘못된 순서로 얻을 :

SELECT * FROM categories ORDER BY path; 

출력이 나타납니다

+------+-----------+--------+-------------+ 
| id | parent_id | slug | path  | 
+------+-----------+--------+-------------+ 
| 1 |  NULL | foo | /foo  | 
| 3 |  NULL | foo-it | /foo-it  | 
| 4 |   3 | boy | /foo-it/boy | 
| 2 |   1 | bar | /foo/bar | 
+------+-----------+--------+-------------+ 
4 rows in set (0.00 sec) 

이 때문에 야기 할을 - 대부분의 (모든?) 데이터 정렬에서 앞에 /.

미친 것은 유닉스 정렬 명령 줄 유틸리티가 옳은 일을합니다. 모든 경로를 파일에 저장하고 정렬하면 정확한 결과를 얻을 수 있습니다.

$ sort paths.txt 
/foo 
/foo/bar 
/foo-it 
/foo-it/boy 

MySQL에서 트리를 올바르게 정렬 할 수있는 방법이 있습니까? 유닉스의 sort 유틸리티가하는 것과 같은 방식으로 정렬하려면? 아마도 다른 데이터 정렬 또는 무언가? 아니면 다른 속임수?

+0

당신은'/'모든 경로를 끝낼 수 있었다. – Solarflare

답변

1

이 시도 :

SELECT * FROM categories ORDER BY path + '/'; 

는 생산 : /foo//foo- 다음에 오는 있기 때문에

/foo-it 
/foo-it/boy 
/foo 
/foo/bar 

/foo/foo-it 후 정렬됩니다.

-을 주문하면 / 뒤에 오는 것으로 바꾸거나 경로 또는 파일 이름에 사용할 수없는 것과 비슷한 느낌을 줄 수 있습니다.

SELECT * FROM categories ORDER BY replace(path,'-','?') + '/'; 

는 생산 :

/foo 
/foo/bar 
/foo-it 
/foo-it/boy 
+0

정말 고맙습니다. –

관련 문제