连接中的sql连接?

连接中的sql连接?,sql,mysql,join,greatest-n-per-group,Sql,Mysql,Join,Greatest N Per Group,我需要你的帮助来构建一个SQL语句,我想不通 在数据库中,我有四个表-文件、文件夹、文件夹、文件和链接 我有很多档案。其中一个名为“myFile.txt” 我有很多文件夹。“myFile.txt”在其中一些文件中。它出现的第一个文件夹称为“firstFolder” 我有很多文件夹的链接。“firstFolder”的第一个链接称为“firstLink” 该示例的数据结构为: // files Id: 10 Name: "myFile.txt" // folders Id: 20 Name: "f

我需要你的帮助来构建一个SQL语句,我想不通

在数据库中,我有四个表-文件、文件夹、文件夹、文件和链接

我有很多档案。其中一个名为“myFile.txt”

我有很多文件夹。“myFile.txt”在其中一些文件中。它出现的第一个文件夹称为“firstFolder”

我有很多文件夹的链接。“firstFolder”的第一个链接称为“firstLink”

该示例的数据结构为:

// files
Id: 10
Name: "myFile.txt"

// folders
Id: 20
Name: "firstFolder"

// folder_files (join table)
Id: 30
Folder_Id: 20 (meaning "firstFolder")
File_Id: 1 (meaning "myFile.txt")

// links
Id: 40
Name: "firstLink"
Folder_Id: 20 (meaning "firstFolder")
第一个问题:如何获取“myFile.txt”的记录以及“firstLink”(第一个链接)的名称和Id,根据文件夹和链接的最低Id查询文件Id=10

第二个问题:如何获取“myFile.txt”的记录以及“firstLink”(第一个链接)的名称和Id,根据文件夹和链接的最低Id查询所有文件

换句话说,我如何获得第一个包含“myFile.txt”的文件夹的链接

产生的记录如下所示:

Id: 10
Name: "myFile.txt"
LinkId: 40
LinkName: "firstLink"

谢谢

这将选择文件id 10的所有链接:

select links.id, links.name
 from files
 left join folder_files on files.id = folder_files.file_id
 left join folders on folder_files.folder_id = folders.id
 left join links on links.folder_id = folders.id
 where files.id=10;

更改where子句,添加limit或其他您想要的内容。修改这个应该很简单。

您应该试着考虑您希望结果集的外观。SQL是用来描述结果集的。如果可以写出一个假设的结果集,那么编写将呈现该结果集的SQL可能会更容易

我很难理解你在寻找什么,但我相信这是一个相当直截了当的问题。如果你能更清楚地描述你的结果,我就能更容易地帮助你,尽管你可能不再需要我的帮助了

例如(使用原始模式)Q1和Q2:

files.Id,files.Name,links.Id,links.Name
(4列)

问题1:

JOIN
with folders表不是必需的)

问题2:

ASC
更改为
DESC

我会尝试以下方法:

select f.*
        , l.Id as LinkId
        , l.Name as LinkName, 
    from Link l
        inner join Folder_Files ff on ff.Folder_Id = l.Folder_Id
        inner join Files f on f.Id = ff.File_Id
    where f.Id = 10
导致:

 Id | Name       | LinkId | LinkName
 10 | myFile.txt | 40     | firstLink
这就是你想要的吗?

考虑到:

  • 每个文件包含更多文件夹
  • 每个文件夹有更多链接
  • 将最低id文件夹作为链接,将最低id链接作为文件夹
借助于:

文件表中所有文件的答案(对于单个文件,使用JohnB的解决方案会更快):


“第一个”是指ID最低的吗?我添加了标签
magest-n-per-group
。试着点击这个标签,你会看到许多其他类似问题的案例,以及解决方案。试着阅读其中的一些,然后回来用你尝试过的内容编辑你的问题(你最好自己做家庭作业)。很抱歉,我不得不分解您的
子选择
标记,因为限制为五个标记。但是你不一定需要一个子选择来解决这个问题。@Wrikken-是的,最低Id.@bill-谢谢你的编辑,虽然我对SQL很熟悉,但我真的不知道每个组的最大n值是如何关联的?我想我只是在加入。。。?在发布之前,我在这个论坛和网络上翻了一个小时。很抱歉,我的问题措辞错误。我想获得链接的名称和Id,以及文件的记录数据。所以它们不是单独的查询。谢谢-我在发布后不久就想到了这一点,但它没有出现在我的编辑中。现在就在那里,就这样!两个内部连接!这就是我错过的。谢谢
 Id | Name       | LinkId | LinkName
 10 | myFile.txt | 40     | firstLink
SELECT file_id, file_name, link_id, link_name FROM (
SELECT file_id, file_name, link_id, link_name,
    @r := CASE WHEN @prev_file_id = file_id
                    THEN @rn + 1
                    ELSE 1
               END AS r,
    @prev_file_id := file_id
FROM (
    SELECT
        f.id as file_id, f.name as file_name, l.id as link_id, l.name as link_name
    FROM files f
    JOIN folder_files ff
    ON ff.file_id = f.id
    JOIN links l
    ON l.folder_id = ff.folder_id
    ORDER BY ff.folder_id, l.id -- first folder first, first link to first folder second
) derived1,
(SELECT @prev_file_id := NULL,@r:=0) vars
) derived2
WHERE r = 1;