连接中的sql连接?
我需要你的帮助来构建一个SQL语句,我想不通 在数据库中,我有四个表-文件、文件夹、文件夹、文件和链接 我有很多档案。其中一个名为“myFile.txt” 我有很多文件夹。“myFile.txt”在其中一些文件中。它出现的第一个文件夹称为“firstFolder” 我有很多文件夹的链接。“firstFolder”的第一个链接称为“firstLink” 该示例的数据结构为:连接中的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
// 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链接作为文件夹
“第一个”是指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;