2012-06-15 24 views
1

我相信這很容易,但如此幫助我無法弄清楚爲什麼我不能返回正確的結果。在MySQL中使用單個映射表選擇兩個查詢的交集

漂亮的標準設置,我有一個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 mt2 ON mt2.containerid=ref_product.id 
AND mt2.containertype='PROD' 
AND mt2.tagid=ref_tag.tagid 
AND ref_tag.tagname='red' 

正確返回所有產品familyids的將標籤'紅色'映射到它們。同樣地:

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' 

正確返回映射到它們的標籤爲'現代當代'的產品familyid。問題是,我如何才能返回一個僅有產品家族名單,這些家族的名稱都與其相關?

我想這一點,並返回空:

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

伯尼,感謝您的答覆...但我不知道這會有所幫助。我試圖找出如何構造這個小句子...這是一個更大的查詢的一部分,有十幾個條件(還有更多的連接表和我已經分組在其他東西上)。所以我試圖瞭解是否有辦法將結果嚴格限制返回到只有兩個標籤都映射的結果。任何其他方式來剝皮這隻貓? – OldSchool

+0

我會補充一點,我真的不需要返回tag_id或tag_name,只是由所有傳遞的標籤標記的product.familyid。 – OldSchool

+0

非常歡迎。請注意,您可以將此查詢用作外部查詢中的子查詢。或者加入(有些人稱之爲派生表),或者將它用作相關子查詢(在外部查詢的WHERE子句中)。 – bernie