Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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/3/xpath/2.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 - Fatal编程技术网

Sql 选择满足所有连接图元条件的图元

Sql 选择满足所有连接图元条件的图元,sql,Sql,我发现很难给这个问题加上一个合适的标题,但也许那是因为我不知道如何实现我的目标 我有以下数据库布局: table: folders columns: folderId table: files columns: fileId, authorId table: file_relation columns: folderId, fileId table: authors columns: authorId, surname, firstName 我试图实现的是列出所有只包含作者XY(姓氏

我发现很难给这个问题加上一个合适的标题,但也许那是因为我不知道如何实现我的目标

我有以下数据库布局:

table:   folders
columns: folderId

table: files
columns: fileId, authorId

table: file_relation
columns: folderId, fileId

table: authors
columns: authorId, surname, firstName
我试图实现的是列出所有只包含作者XY(姓氏=X,名字=Y)文件的文件夹。我的方法是这样的:

SELECT f.folderId FROM `folders` f 
     INNER JOIN `file_relation` rel ON rel.folderId = f.folderId 
     INNER JOIN `files` fls ON fls.fileId = rel.fileId 
     INNER JOIN `authors` a ON a.authorId = fls.authorId 
WHERE a.surname = X and a.firstName = Y;
SELECT f.folderId,
    COUNT(fls.fileId) as filesCount,
    SUM(a.surname = 'X' and a.firstName = 'Y') as authorFilesCount
FROM `folders` f 
     INNER JOIN `file_relation` rel ON rel.folderId = f.folderId 
     INNER JOIN `files` fls ON fls.fileId = rel.fileId 
     INNER JOIN `authors` a ON a.authorId = fls.authorId 
GROUP BY f.folderId
HAVING filesCount = authorFilesCount;

现在,我列出了所有的文件夹,其中有来自上述作者的文件。但是,我现在如何限制它们仅在没有其他文件的情况下列出

最好使用聚合函数而不是子查询。查询将如下所示:

SELECT f.folderId FROM `folders` f 
     INNER JOIN `file_relation` rel ON rel.folderId = f.folderId 
     INNER JOIN `files` fls ON fls.fileId = rel.fileId 
     INNER JOIN `authors` a ON a.authorId = fls.authorId 
WHERE a.surname = X and a.firstName = Y;
SELECT f.folderId,
    COUNT(fls.fileId) as filesCount,
    SUM(a.surname = 'X' and a.firstName = 'Y') as authorFilesCount
FROM `folders` f 
     INNER JOIN `file_relation` rel ON rel.folderId = f.folderId 
     INNER JOIN `files` fls ON fls.fileId = rel.fileId 
     INNER JOIN `authors` a ON a.authorId = fls.authorId 
GROUP BY f.folderId
HAVING filesCount = authorFilesCount;

你可以使用where not exists你说的“没有其他文件”是什么意思?您想要的结果是作者有一个文件但不超过一个文件?谢谢,where not EXISTS工作了@亚历克斯·约翰逊:我要声明的是,在这个文件夹中没有其他文件不是由作者X Y创建的。