2013-06-27 73 views
2

我真的被困在如何創建適當的選擇語句,並會感謝您可以提供任何指導。一對多關係查詢

我創建了一個迷你文檔管理系統,允許用戶上傳文件並按類別對這些文件進行分類。每個文件可以選擇一個或多個類別。以下是我的表:

表:文件(PKEY(主鍵),FILE_NAME,file_description,FILE_PATH)

pKey file_name file_description  file_path 
1  IT001.DOC Network Design Document /common/it/ 
2  IT002.DOC Desktop Standards  /common/it/ 
3  IT003.DOC Laptop Standards  /common/it/ 

還有另外其他部門從IT這樣的路徑場也改變(只要想到我會折騰數據的是位)

表:類別(PKEY(主鍵),category_description)

pKey category_description 
1  Central Missouri Campus 
2  Eastern Missouri Campus 
3  Western Missouri Campus 
4  Desktops 
5  Laptops 
6  Networks 
7  Printers 

當然還有其他類別爲好,這僅僅是一個採樣

表:category_xref(PKEY(主鍵),fk_file_id,fk_category_id)

pKey fk_file_id fk_category_id 
1  1   1 
2  1   2 
3  1   6 
4  2   2 
5  2   3 
6  2   4 
7  3   1 
8  3   2 
9  3   3 
10 3   5 

當用戶搜索相關文檔時,會顯示帶有類別複選框的表單。通過選擇Central,他們可以獲得所有標記爲Central的文件。通過選擇桌面,他們可以獲得任何已標記爲桌面的文檔。但是,當他們選擇「中央」和「桌面」時,他們將獲得任何「中央」或「桌面」文檔。我需要弄清楚如何只獲取那些既是Central和Desktops又有他們選擇的其他複選框的文檔,並排除那些不包含所有選中複選框的文檔。

SELECT f.pkID, f.file_name, f.file_description, f.file_path, cox.fk_category_id 
FROM files f 
JOIN category_xref cox ON cox.fk_file_id = f.pkID 
WHERE cox.fk_category_id IN (59, 69) 
ORDER BY f.file_name ASC, cox.fk_category_id ASC 
+1

這是不是一個多......這是多對多: )。 「一個文件有N個類別,並且在一個類別內有N個文件」NxN – pleasedontbelong

回答

1

最簡單的方法很可能是:

SELECT f.pkID, f.file_name, f.file_description, f.file_path 
FROM files f 
JOIN category_xref cox ON cox.fk_file_id = f.pkID 
WHERE cox.fk_category_id IN (59, 69) 
GROUP BY f.pkID 
HAVING count(distinct cox.fk_category_id)=2 
ORDER BY f.file_name ASC 
+0

+1不錯......這個解決方案有缺點嗎? – pleasedontbelong

+0

@pleasedontbelong:只有你每個文件只能得到一行,而不是每個文件每行一行,就像在原始查詢中一樣。當然,如果你只想*每個文件一行,這實際上是一個改進。 –

+0

馬克解決方案的快速問題。 HAVING COUNT .. = 2.我是否正確假定2是選定複選框的數量,在這種情況下是複選框59和69? –

0

你可以試一下這些線路:

SELECT f.pkID, f.file_name, f.file_description, f.file_path 
FROM files f 
RIGHT JOIN category_xref cox1 ON cox.fk_file_id = f.pkID AND cox1.fk_category_id = 59 
RIGHT JOIN category_xref cox2 ON cox.fk_file_id = f.pkID AND cox2.fk_category_id = 69 
ORDER BY f.file_name ASC 
+0

只能在少數情況下工作...如果文件有10個類別,您需要執行10個連接 – pleasedontbelong

+0

有沒有問題我不知道在做10個連接? – Noam

+0

問題是性能...這個解決方案可以工作,但它可能很慢 – pleasedontbelong