2013-11-21 158 views
0

我發現它很難用適當的標題標記這個問題,但也許這是因爲我不知道如何實現我的目標。選擇所有連接元素的條件滿足的元素

我有以下的數據庫佈局:

table: folders 
columns: folderId 

table: files 
columns: fileId, authorId 

table: file_relation 
columns: folderId, fileId 

table: authors 
columns: authorId, surname, firstName 

我怎麼努力實現的是上市,只有從筆者X Y(姓= 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; 

現在,列出所有文件夾中存在來自作者的文件。但是,我現在如何限制他們只有在沒有其他文件的情況下才能列出?

+1

你可以使用不存在的地方 –

+0

你是什麼意思「沒有其他文件」?您希望作者有1個文件但不超過1個文件的結果? –

+0

謝謝,WHERE NOT EXISTS工作! @AlexJohnson:我補充說,在文件夾中沒有其他文件不是由作者X Y創建的。 – Muepe

回答

1

最好使用聚合函數而不是子查詢。該查詢將如下所示:

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; 
相關問題