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'

タグ「red」がマップされているすべての製品ファミリIDを正しく返します。同様に:

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'

タグ「moderncontemporary」がマップされている製品ファミリIDを正しく返します。質問は、両方のタグがマッピングされている製品ファミリのみのリストを返すにはどうすればよいですか?

私はこれを試していますが、空が返されます:

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 に答える