問:
我使用封表來跟蹤用戶文件權限,而且,一個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
....
在這種情況下訪問,我想SELECT
/home/joe/foo/bar.txt
因爲領導下到它的每一個父文件夾是可讀的,但我不希望至 SELECT
/home/jim/foo/bar.txt
,因爲其父文件夾之一不可讀。
編輯:或者,我可以重新修改這樣的問題:「我可以AND
跨多行的一列的值嗎?」
+1對於很好的格式。 – Sarfraz
@Sarfraz我發現如果我花了額外的15分鐘格式,我的問題得到500%的更多關注。 – puk