Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不知道如何编写复杂的SQL查询_Sql_Mysql_Greatest N Per Group_Subquery - Fatal编程技术网

不知道如何编写复杂的SQL查询

不知道如何编写复杂的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

我有以下数据库结构:

File、User、FileRevision具有文件的外键,以及通过中间表到用户的多2多连接

我要获取以下所有文件修订版:

在相应的文件中是最新/最新的, 具有指向执行搜索权限检查的用户的多2多链接。 我发现我可以通过执行以下操作来完成1:

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;