2017-09-09 5 views
0

특정 루트 디렉토리 아래의 모든 파일을 크롤링 한 결과를 저장하는 데 사용하는 MariaDB 10.2.8 데이터베이스가 있습니다. 따라서 파일 (file 테이블에 있음)에는 부모 디렉토리 (directory 테이블에 있음)가 있습니다. 이 상위 디렉터리는 디렉터리 크롤링이 시작된 원래 지점까지 자신의 부모를 가질 수 있습니다. 내가 /home에서 크롤링을 한 경우에MariaDB 재귀 CTE의 순서 반전

그래서, 파일 /home/tim/projects/foo/bar.py는 상위 디렉토리 projects 등을했을 상위 디렉토리 foo를 가질 것이다. /home (크롤링 루트)에는 null 상위가 있습니다.

나는 다음과 같은 재귀 CTE있어 :

(예상대로) @FileID 파일의 기본 키 순서에 결과를 반환
with recursive tree as (
    select id, name, parent from directory where id = 
    (select parent from file where id = @FileID) 
    union 
    select d.id, d.name, d.parent from directory d, tree t 
    where t.parent = d.id 
) select name from tree; 

. 예 :

Welcome to the MariaDB monitor. Commands end with ; or \g. 
Your MariaDB connection id is 17 
Server version: 10.2.8-MariaDB-10.2.8+maria~jessie-log mariadb.org binary distribution 

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

MariaDB [(none)]> use inventory; 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 

Database changed 
MariaDB [inventory]> with recursive tree as (
    -> select id, name, parent from directory where id = 
    -> (select parent from file where id = 3790) 
    -> union 
    -> select d.id, d.name, d.parent from directory d, tree t 
    -> where t.parent = d.id 
    ->) select name from tree; 
+----------+ 
| name  | 
+----------+ 
| b8  | 
| objects | 
| .git  | 
| fresnel | 
| Projects | 
| metatron | 
+----------+ 
6 rows in set (0.00 sec) 

MariaDB [inventory]> Bye 
[email protected]:~$ 

그래서이 경우, 파일 ID 3790은 ( /metatron은 물론, 크롤링의 루트) 디렉토리 /metatron/Projects/fresnel/.git/objects/b8에서 파일을 해당합니다.

안정적인 출력 순서를 바꿀 수 있습니다 (전체 경로를 생성하기 위해 함께 연결하려는 경우). 나는 order by id 할 수 있지만이 경우에는 자녀가 부모보다 높은 신분증을 가짐을 알고 있음에도 불구하고 이것은 신뢰할 수 없다고 느낄 수 있습니다. 항상 모든 상황에서 CTE를 사용하고 싶다는 보장을 할 수는 없습니다. .

답변

-1
(
    your-current-query 
) ORDER BY ...; 

(당신이에 문제가있는 경우에, 너무 앞에 SELECT ... 스틱.