【发布时间】:2017-06-30 19:11:40
【问题描述】:
我正在构建一个文档管理器,其中一个文件可以属于多个文件夹(当从前端执行复制操作时),一个文件夹同样可以属于多个文件,还要记住一个文件和文件夹可以属于到另一个文件夹。通过该设计,我选择了多对多关系,因为这很有意义。我有三个表文件夹,文件,文件文件夹,其中文件文件夹是数据透视表。
我的简单数据库架构定义如下:
文件:
file_id | name
1 | document.docx
文件夹:
folder_id | name
1 | root
2 | images
file_folder:
file_id | folder_id | phash
NULL | 2 | 1
1 | NULL | 1
现在的问题是,我一直在尝试编写一个连接查询,如果它们共享同一个文件夹,则返回文件和文件夹的列表,下面是我尝试过但没有一个能够返回的查询列表想要的结果。
我非常希望我的结果是这样的:
file_id | folder_id | name
1 | NULL | document.docx
NULL | 2 | images
SELECT * FROM
folders dir
JOIN file_folder dir_file
ON dir_file.dir_id = dir.dir_id
JOIN files file
ON dir_file.file_id = file.file_id
WHERE dir_file.dir_id = 1 ORDER BY dir_file.created_at
SELECT * FROM
folders dir,files file
JOIN file_folder dir_file
ON (dir_file.file_id = file.file_id OR dir_file.dir_id = dir.dir_id)
WHERE dir_file.dir_id = 1 ORDER BY dir_file.created_at
我知道我只是遗漏了一些东西,我还无法弄清楚。或者也许只是让 DB Schema 完全错误。我真的不想将文件和文件夹放在同一张表上并引用 phash(父文件夹),这会起作用,但是将带有文件的文件夹复制到另一个文件夹只会复制文件夹而不是其中的文件,因为我将不得不复制所有子文件夹和文件才能做到这一点,这非常糟糕。如果我能找到解决方案,我将不胜感激
已编辑:
下面对我来说现在很好!
SELECT * FROM folders dir
LEFT JOIN file_folder dir_file
ON dir_file.dir_id = dir.dir_id
LEFT JOIN files file
ON dir_file.file_id = file.file_id
WHERE dir_file.phash = 1 ORDER BY dir_file.created_at
【问题讨论】:
标签: mysql sql database join database-schema