2013-06-27 8 views
2

나는 정말 적절한 select 문을 작성하는 방법에 집착하고 제공 할 수있는 모든 지침을 고맙게 생각합니다.일대 다 관계 쿼리

사용자가 파일을 업로드하고 범주별로 파일을 분류 할 수있는 미니 문서 관리 시스템을 만들었습니다. 각 파일에는 하나 이상의 카테고리가 선택 될 수 있습니다.

표 : 파일 (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)

0,123,516 카테고리 : 그냥 내가)에

표를 자료의 비트를 던져 줄 알았는데 물론 다른 카테고리 이것은 단지 샘플링을하고, 거기에도

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 AND Desktop을 선택하면 Central or Desktop 중 하나 인 문서를 가져옵니다. 중앙 AND 데스크탑과 선택한 다른 모든 체크 상자 만있는 문서를 가져 오는 방법을 알아 내고 선택된 모든 확인란을 포함하지 않는 문서는 제외하십시오.

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

Mark의 해결책에 대한 빠른 질문. 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