不知道如何编写复杂的SQL查询
我有以下数据库结构: File、User、FileRevision具有文件的外键,以及通过中间表到用户的多2多连接 我要获取以下所有文件修订版: 在相应的文件中是最新/最新的, 具有指向执行搜索权限检查的用户的多2多链接。 我发现我可以通过执行以下操作来完成1:不知道如何编写复杂的SQL查询,sql,mysql,greatest-n-per-group,subquery,Sql,Mysql,Greatest N Per Group,Subquery,我有以下数据库结构: File、User、FileRevision具有文件的外键,以及通过中间表到用户的多2多连接 我要获取以下所有文件修订版: 在相应的文件中是最新/最新的, 具有指向执行搜索权限检查的用户的多2多链接。 我发现我可以通过执行以下操作来完成1: SELECT created_on, file_id FROM FileRevision WHERE created_on = (SELECT MAX(created_on) FROM FileRevision
SELECT created_on, file_id FROM FileRevision
WHERE created_on = (SELECT MAX(created_on) FROM FileRevision
WHERE filed_id = file_id)
但我不知道如何同时执行m2m权限检查,只需将此添加到查询中:
UNION
SELECT created_on, file_id
FROM FileRevision fr
WHERE fr.user_id = ?
替换?根据您的权限检查使用您想要的任何值
此外,如果将查询替换为:
SELECT created_on, file_id
FROM FileRevision fr
JOIN
(
SELECT file_id, MAX(created_on) as latestDate
FROM FileRevision
GROUP BY file_id
) latest ON latest.file_id = fr.file_id
AND latest.latestDate = fr.created_on
您将避免相关的重复子查询。要检查权限,您需要检查请求文件的用户的其他多2多权限表中是否存在记录。因此,添加And/OR Exists子句。。。 如果您希望,因为我怀疑只有请求者有权访问、使用和修改的最新版本 如果您想要最后版本和记录,请求者可以访问、使用或删除
SELECT created_on, file_id
FROM FileRevision r
WHERE created_on =
(SELECT MAX(created_on)
FROM FileRevision
WHERE file_id = r.file_id)
And Exists -- Change 'And' to 'Or if you want both
(Select * From M2MIntermediatePermissionsTable
Where File_Id = r.File_Id
And userId = ?)
这是最大n-每组问题的一个变体。下面是我如何在没有子查询和分组的情况下解决它的:
将所需的用户id替换为?谢谢,我主要使用了Bill Karwin的解决方案,但这也向我展示了一些新的SQL技巧。谢谢,Exists+中间表选择非常有用!这个答案是我最喜欢的+连接序列,在我看来,它是复杂查找的强大武器。
SELECT f1.*
FROM Permissions p -- this is the many-to-many table
JOIN FileRevision f1
ON (f1.file_id = p.file_id)
LEFT OUTER JOIN FileRevision f2
ON (f2.file_id = p.file_id AND f1.created_on < f2.created_on)
WHERE p.user_id = ? AND f2.file_id IS NULL;