質問:
ユーザー ファイルのアクセス許可を追跡するためにクロージャ テーブルを使用していJOIN
ますread
。結合されたすべての行が読み取り可能な場合にのみ、行を選択したい。を使用UNION
しても、明らかにこれは達成されません。
詳細:
フォルダ テーブル:
CREATE TABLE IF NOT EXISTS folders
(
id INT NOT NULL AUTO_INCREMENT,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
PRIMARY KEY ( id )
)engine=innodb;
ファイル テーブル:
CREATE TABLE IF NOT EXISTS files
(
id INT NOT NULL AUTO_INCREMENT,
parent_folder_id INT NOT NULL ,
path VARCHAR(500) NOT NULL,
r BOOL NOT NULL DEFAULT FALSE,
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)engine=innodb;
フォルダ - 親フォルダ クロージャ テーブル:
CREATE TABLE IF NOT EXISTS parent_folders
(
id INT NOT NULL AUTO_INCREMENT,
folder_id INT NOT NULL,
parent_folder_id INT NOT NULL,
FOREIGN KEY ( folder_id ) REFERENCES folders ( id ),
FOREIGN KEY ( parent_folder_id ) REFERENCES folders ( id ),
PRIMARY KEY ( id )
)engine=innodb;
ここで、すべての読み取り可能なファイルを取得したい場合 (ユーザーを完全に省略したことは今のところ無視します)、次のように開始します。
SELECT
F.id, F.path, F.r, P.parent_folder_id, D.path, D.r
FROM
files AS F
LEFT JOIN parent_folders AS P
ON F.parent_folder_id = P.folder_id
LEFT JOIN folders AS D
ON P.parent_folder_id = D.id;
これにより、すべてのファイル ID、パス、および読み取りアクセス許可のテーブルが表示され、その親フォルダーのそれぞれからアクセスできるようになります。
id path r id path r
......
0 /home/joe/foo/bar.txt True 1 /home/joe/foo True
1 /home/joe/foo/bar.txt True 2 /home/joe True
1 /home/joe/foo/bar.txt True 3 /home True
1 /home/joe/foo/bar.txt True 4 / True
2 /home/jim/foo/bar.txt True 5 /home/jim/foo True
2 /home/jim/foo/bar.txt True 6 /home/jim False
2 /home/jim/foo/bar.txt True 7 /home True
2 /home/jim/foo/bar.txt True 8 / True
....
この場合、それにつながるすべての親フォルダーが読み取り可能であるため、そうしたいと思いますが、その親フォルダーの 1 つが読み取り可能でないため、SELECT
/home/joe/foo/bar.txt
そうしたくありません。SELECT
/home/jim/foo/bar.txt
編集:別の方法として、質問を次のように言い換えることもできAND
ます。