2016-06-26 3 views
0

그래서 음악 데이터베이스를 만들고 있습니다. 세 개의 테이블 (파일, 범주, categories_assignments)을 사용하고 있습니다.SQL 내부 조인 및 여러 행에

나는 (참조 아래에 포함) 여러 범주에있는 파일을 내가 이미 or 분산을 만든

(팝과 록 둘 다 예를 들어, 노래)을 선택 할 수 있도록하려는

SELECT DISTINCT `files`.`filename` FROM `files` 
INNER JOIN `categories_assignments` 
ON `files`.`id` = `categories_assignments`.`fileid` 
INNER JOIN `categories` 
ON `categories_assignments`.`catid` = `categories`.`id` 
WHERE `categories`.`name` = 'rock' OR `categories`.`name`='pop'; 
당신은 노래를 찾고 있습니다 -
+0

질문은 무엇입니까? ... – scaisEdge

답변

1

이것은 "설정에서-세트"문제를 가진 경우에만 해당 그룹을 여기에는 일련의 카테고리가 있습니다. 나는 group byhaving를 사용하여이 문제를 해결하려면 :

SELECT f.filename 
FROM files f JOIN 
    categories_assignments ca 
    ON f.id = ca.fileid JOIN 
    categories c 
    ON ca.catid = c.id 
WHERE c.name IN ('rock', 'pop') 
GROUP BY f.filename 
HAVING COUNT(*) = 2; 

참고 :

  • 테이블 별칭 쓰기 및 읽기 쿼리를 쉽게합니다.
  • 모든 식별자 주변에 백틱을 넣을 필요가 없습니다. 그러면 쿼리를 읽기가 더 어려워집니다.
  • OR 개의 비교 대신 IN을 사용해야합니다.
  • SQL을 배우는 경우 SELECT DISTINCT은 거의 유용하지 않습니다. 먼저 GROUP BY을 사용하는 방법을 배우십시오.
0

그룹 파일에 의해 두 종류

SELECT f.filename 
FROM files f 
INNER JOIN categories_assignments ca ON f.id = ca.fileid 
INNER JOIN categories c ON ca.catid` = c.id 
WHERE c.name in ('rock', 'pop') 
GROUP BY f.filename 
HAVING count(c.name) = 2