2012-06-15 2 views
1

이것이 쉽지만 정확한 결과를 반환 할 수없는 이유를 알 수는 없습니다.MySQL에서 하나의 맵 테이블로 두 개의 쿼리의 교차 선택하기

SELECT DISTINCT ref_product.familyid,ref_tag.tagid 
FROM (ref_tag,ref_product) 
JOIN ref_tagmap AS mt2 ON mt2.containerid=ref_product.id 
AND mt2.containertype='PROD' 
AND mt2.tagid=ref_tag.tagid 
AND ref_tag.tagname='red' 

올바르게 제품 familyids을 모두 반환

예쁜 표준 설정, 나는 ref_product 테이블, ref_tagmap 테이블과 ref_tag 테이블 ...

CREATE TABLE `ref_product` (
`id` DOUBLE , 
`name` VARCHAR (765), 
`familyid` DOUBLE); 

INSERT INTO `ref_product` (`id`, `name`, `familyid`) VALUES('264','Old Red Fixture 1','4'); 
INSERT INTO `ref_product` (`id`, `name`, `familyid`) VALUES('30206','Modern Red Fixture 2','405'); 


CREATE TABLE `ref_tag` (
`TagID` DOUBLE , 
`TagName` VARCHAR (150)); 

INSERT INTO `ref_tag` (`TagID`, `TagName`) VALUES('103','Modern Contemporary'); 
INSERT INTO `ref_tag` (`TagID`, `TagName`) VALUES('131','Red'); 

CREATE TABLE `ref_tagmap` (
`MapID` DOUBLE , 
`tagid` DOUBLE , 
`containertype` VARCHAR (45), 
`containerid` DOUBLE); 

INSERT INTO `ref_tagmap` (`MapID`, `tagid`, `containertype`, `containerid`) VALUES('17035','131','PROD','264'); 
INSERT INTO `ref_tagmap` (`MapID`, `tagid`, `containertype`, `containerid`) VALUES('17747','131','PROD','30206'); 
INSERT INTO `ref_tagmap` (`MapID`, `tagid`, `containertype`, `containerid`) VALUES('31959','103','PROD','30206'); 

사용하여이 테이블을 쿼리가 그 (것)들에지도로 만들어진 "빨간"꼬리표가있는. 마찬가지로 :

SELECT DISTINCT ref_product.familyid,ref_tag.tagid 
FROM (ref_tag,ref_product) 
JOIN ref_tagmap AS mt1 ON mt1.containerid=ref_product.id 
AND mt1.containertype='PROD' 
AND mt1.tagid=ref_tag.tagid 
AND LCASE(ref_tag.tagname)='modern contemporary' 

는 정확하게 매핑 태그 '현대 현대'를 가지고있는 제품 familyids를 반환합니다. 질문 : 태그가 모두 매핑되어있는 제품 가족 목록 만 반환하려면 어떻게해야합니까?

내가이 노력하고있어,이 비어 반환

SELECT DISTINCT ref_product.familyid,ref_tag.tagid 
FROM (ref_tag,ref_product) 
JOIN ref_tagmap AS mt2 ON mt2.containerid=ref_product.id 
AND mt2.containertype='PROD' 
AND mt2.tagid=ref_tag.tagid 
AND ref_tag.tagname='red' 
JOIN ref_tagmap AS mt1 ON mt1.containerid=ref_product.id 
AND mt1.containertype='PROD' 
AND mt1.tagid=ref_tag.tagid 
AND LCASE(ref_tag.tagname)='modern contemporary' 

나는 여기에 근본적인 뭔가를 누락 가정이 ... 조밀 한 느낌. 도와주세요.

감사합니다.

답변

1

일반적인 방법은 tag 테이블의 고유 항목 수가 분리하려는 태그 수와 동일한 지 확인하는 것입니다.
예 : 액션에서

SELECT p.familyid 
FROM ref_product p 
     JOIN ref_tagmap tm ON tm.containerid=p.id 
     AND tm.containertype='PROD' 
     JOIN ref_tag t ON t.tagid = tm.tagid 
     AND t.tagname IN ('red', 
         'modern contemporary') 
GROUP BY p.familyid 
HAVING count(DISTINCT t.tagid) = 2; 

: 답장을 http://sqlfiddle.com/#!2/f377e/7

+0

버니, 감사합니다 ...하지만 난이 도움이 될 것입니다 확실하지 않다. 나는이 작은 절을 구조화하는 방법을 분리하려고 노력하고있다. ... 12 개 정도의 많은 조건을 가진 훨씬 더 큰 쿼리의 일부이다. (그리고 여러 개의 조인 된 테이블과 나는 이미 다른 것에 그룹화하고있다.) 그래서 나는 두 태그가 매핑 된 결과 만 엄격하게 반환하도록 제한하는 방법이 있는지 이해하려고합니다. 이 고양이를 다듬는 다른 방법은 없나요? – OldSchool

+0

tag_id 또는 tag_name을 반환 할 필요가 없다고 덧붙이겠다. 모든 전달 된 태그에 의해 태그가 지정된 product.familyid 만 반환한다. – OldSchool

+0

당신은 대단히 환영합니다. 이 쿼리는 외부 쿼리에서 하위 쿼리로 사용할 수 있습니다. 그것에 결합하거나 (일부는이 파생 테이블이라고 함) 상관 관계가있는 하위 쿼리 (외부 쿼리의 WHERE 절에서)로 사용합니다. – bernie