正在构建一个文件管理器,其中一个文件可以属于多个文件夹(当从前端执行复制操作时),一个文件夹同样可以属于多个文件,还要记住一个文件和一个文件夹可以属于到另一个文件夹。通过这种设计,我选择了多对多的关系,因为这很有意义。我有三个表 folder、files、file_folder,其中 file_folder 是数据透视表。
我的简单数据库架构定义如下:
文件:
文件编号 |姓名
1 |文档.docx
文件夹:
文件夹编号 |姓名
1 |根
2 |图片
文件文件夹:
文件编号 |文件夹编号 | phash
空 | 2 | 1个
1 |空 | 1
现在的问题是,我一直在尝试编写一个连接查询,如果它们共享同一文件夹,则返回文件和文件夹的列表,下面是我尝试过但没有一个能够返回的查询列表想要的结果。
我非常希望我的结果是这样的:
文件编号 |文件夹编号 |姓名
1 |空 |文档.docx
空 | 2 |图片
选择 * 来自
文件夹目录
加入 file_folder dir_file
ON dir_file.dir_id = dir.dir_id
加入文件文件
ON dir_file.file_id = file.file_id
WHERE dir_file.dir_id = 1 按 dir_file.created_at 排序
选择 * 来自
文件夹目录,文件文件
加入 file_folder dir_file
打开(dir_file.file_id = file.file_id 或 dir_file.dir_id = dir.dir_id)
WHERE dir_file.dir_id = 1 按 dir_file.created_at 排序
我知道我只是遗漏了一些东西,我还不能弄明白。或者也许我只是让数据库模式完全错误。我真的不想将文件和文件夹放在同一个表上并引用 phash(父文件夹),这会起作用,但是将包含文件的文件夹复制到另一个文件夹只会复制文件夹而不是其中的文件,因为我将不得不复制所有子文件夹和文件才能实现这一点,这非常糟糕。如果我能找到解决方案,我将不胜感激
已编辑:
下面现在对我来说工作正常!
SELECT * FROM 文件夹 dir
左连接 file_folder dir_file
ON dir_file.dir_id = dir.dir_id
左连接文件文件
ON dir_file.file_id = file.file_id
WHERE dir_file.phash = 1 按 dir_file.created_at 排序
最佳答案
由于您并不总是在应该使用左连接的表之间进行匹配
SELECT *
FROM folders dir
LEFT JOIN file_folder dir_file ON dir_file.dir_id = dir.dir_id and dir_file.phash = 1
LEFT JOIN files file ON dir_file.file_id = file.file_id
ORDER BY dir_file.created_at
并在左连接中移动 On 子句中的 where 条件(否则用作内部连接)
关于mysql - SQL 查询从一个或 3 个表中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853395/