SQL 从任一或 3 个表中查询到 Select
SQL Query To Select From Either Or 3 Tables
正在构建一个文件管理器,其中一个文件可以属于多个文件夹(当从前端执行复制操作时),一个文件夹也可以属于多个文件,同样要记住一个文件和一个文件夹可以属于另一个 folder.With 我选择多对多关系的设计,因为这很有意义。我有三个 tables folders,files,file_folder 其中 file_folder 是枢轴 table.
我的简单数据库架构定义如下:
文件:
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
现在的问题是,我一直在尝试编写一个连接查询,其中 return 是文件和文件夹的列表,如果它们共享同一文件夹,下面是我尝试过的查询列表,但是 none已经能够return想要的结果。
我非常想要这样的结果:
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
我知道我只是遗漏了一些东西,我还不能弄明白。或者也许我只是让数据库模式完全错误。我真的不想将文件和文件夹放在同一个 table 和引用 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
由于您并不总是在表之间进行匹配,因此您应该使用左连接
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 条件(否则用作内部连接)
正在构建一个文件管理器,其中一个文件可以属于多个文件夹(当从前端执行复制操作时),一个文件夹也可以属于多个文件,同样要记住一个文件和一个文件夹可以属于另一个 folder.With 我选择多对多关系的设计,因为这很有意义。我有三个 tables folders,files,file_folder 其中 file_folder 是枢轴 table.
我的简单数据库架构定义如下:
文件:
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
现在的问题是,我一直在尝试编写一个连接查询,其中 return 是文件和文件夹的列表,如果它们共享同一文件夹,下面是我尝试过的查询列表,但是 none已经能够return想要的结果。
我非常想要这样的结果:
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
我知道我只是遗漏了一些东西,我还不能弄明白。或者也许我只是让数据库模式完全错误。我真的不想将文件和文件夹放在同一个 table 和引用 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
由于您并不总是在表之间进行匹配,因此您应该使用左连接
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 条件(否则用作内部连接)