1

我确定这很容易,但是请帮助我,我无法弄清楚为什么我不能返回正确的结果。

相当标准的设置,我有一个 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'

正确返回所有映射到标签“红色”的产品家族。相似地:

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'

正确返回映射到标签“现代当代”的产品家族。问题是,我如何返回仅包含两个标签映射到它们的产品系列的列表?

我正在尝试这个,它返回空:

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'

我不得不假设我在这里遗漏了一些基本的东西……感觉很密集。请帮忙。

谢谢!

4

1 回答 1

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

于 2012-06-15T01:08:23.287 回答