2012-07-10 2 views
0

두 개의 SQL 테이블 'products'및 'tags'가 있습니다. 이들은 세 번째 테이블 'product_tags'를 사용하여 n : m 관계를 유지합니다.mysql n : m 관계 : 여러 특정 관계가있는 행 찾기

쿼리를 사용하여 특정 태그가 여러 개있는 모든 제품을 찾고 싶습니다. 예를 들어 태그 1, 23 및 54와 관련이있는 모든 제품을 찾으십시오.

하나의 쿼리로이 작업을 수행 할 수있는 방법이 있습니까?

답변

4

이 솔루션을 사용할 수 있습니다. 이 ALL 키워드 1, 23, 54를 포함하는 모든 제품을 가져옵니다 3WHERE IN 목록에있는 항목의 수입니다, 그래서 당신이 따라 태그의 양에 따라 조정할 수 있습니다

SELECT a.* 
FROM products a 
INNER JOIN product_tags b ON a.product_id = b.product_id 
WHERE b.tag_id IN (1,23,54) 
GROUP BY a.product_id 
HAVING COUNT(1) = 3 

당신 확인하고 싶다.

+0

COUNT (1) = 3 – Narendra

+0

HAVING 절을 'HAVING COUNT (b.tag_id) = 3'으로 바꾸고'GROUP BY a.id'를 추가하면 완벽하게 작동합니다. – Majiy

+0

COUNT 뒤에있는 이유는 대괄호 안의 요소 중 몇 개가 일치하는지 (...)는 신경 쓰지 않기 때문입니다. COUNT가 없으면 결과는 "정확히 모든 태그가있는 모든 제품"대신 "모든 태그가있는 모든 제품"이됩니다. – Majiy

0

내가 열 이름을 가정하고

PRODUCTS p 
JOIN PRODUCT_TAGS pt ON p.ID = pt.PRODUCT_ID 
JOIN TAGS t ON pt.TAG_ID = t.ID AND 
     t.ID IN (1, 23, 54) 

로부터이

SELECT *를 사용해보십시오. 컬럼 이름은 직설적이며 컬럼 이름을 쉽게 사용할 수 있다고 생각합니다. 더 많은 설명이 필요하면 알려주세요.

관련 문제