특정 루트 디렉토리 아래의 모든 파일을 크롤링 한 결과를 저장하는 데 사용하는 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를 사용하고 싶다는 보장을 할 수는 없습니다. .