【问题标题】:SQL Query To Select From Either Or 3 Tables从一个或三个表中选择的 SQL 查询
【发布时间】: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


    【解决方案1】:

    由于表之间并不总是匹配,所以应该使用左连接

      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 条件(否则作为内连接)

    【讨论】:

    • 非常感谢,您的回答实际上为我指明了正确的方向。查看我上面的问题以获取已编辑的正确版本。
    • @thanks .. answer update with phash .. in condition
    猜你喜欢
    • 2023-04-06
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多