mysql - SQL 查询从一个或 3 个表中选择

标签 mysql sql database join database-schema

正在构建一个文件管理器,其中一个文件可以属于多个文件夹(当从前端执行复制操作时),一个文件夹同样可以属于多个文件,还要记住一个文件和一个文件夹可以属于到另一个文件夹。通过这种设计,我选择了多对多的关系,因为这很有意义。我有三个表 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/

相关文章:

android - 我可以使用 Google 云端硬盘作为数据库吗?

mysql - 查询中的问题。不工作

mysql - 是否可以索引此mysql查询中的所有字段?

mysql - 使用 mysql 查找下一个空闲整数

sql - 从结果中选择最大日期行

mysql - 关于带有 order by 和 limit 的 select * 的可重复读取

java - 我在使用 Java 将数据插入 mysql 数据库时遇到问题

MySQL 可以进行单查询吗?

mysql - 无法向现有表添加外键

python - sqlalchemy:如何通过一个查询连接多个表?