3

我有 3 个表:产品、标签和 products_tags(产品和标签之间的多对多)。在我的架构中,一个产品可以有零到多个标签,一个标签可以有零到多个产品。现在我想选择具有特定标签但没有特定标签的产品。

产品表:

idproducts / 名称

1 / 三星银河

2/三星note1

3/三星note2

4 / iphone 4gs

标签表:

身份证/字

1 / 三星

2 / 银河

3/注1

4 /注2

5 / iphone

6 / 4克

7个/苹果

Products_Tags表:

产品/标签

1 / 1

1 / 2

2 / 1

2 / 3

3 / 1

3 / 4

4 / 5

4 / 6

我有下面的查询,但它为我提供了带有我想要的标签的产品,因为它们有一些其他标签,并且作为连接的结果,它们出现在结果集中。

SELECT * FR0M 产品 AS p

JOIN products_tags AS pt ON pt.product = p.idproducts

JOIN tags AS t ON t.idtags = pt.tag

WHERE t.word IN ('samsung', 'mobile')

AND t.word NOT IN ('note1', 'note2')

如果我想要三星 Galaxy,并且我定义了像“三星”这样的标签,而没有“note1”和“note2”。对此的查询是什么?

PS 我想也许应该使用 EXISTS 或 NOT EXISTS,但我只是无法弄清楚我应该如何使用它们。

提前致谢

4

2 回答 2

1

您的查询不起作用,因为连接选择了所有带有标签 samsung 的元素,包括samsung note 1and samsung note 2。您可以使用group_concat对所有标签名称进行分组,然后使用like或对它们进行过滤Regexp,如下所示:

select *, GROUP_CONCAT(t.word) tagname from products as p
  inner JOIN products_tags AS pt ON pt.products = p.productid
  inner Join tags t on t.idtags = pt.tags 
group by p.productid
having tagname not REGEXP 'note1|note2' 
   and tagname REGEXP 'samsung|mobile'

一些重要资源:

于 2012-09-27T23:35:06.767 回答
0

您想要所有带有 samsung 或 mobile 标签但没有 note 1 或 note2 标签的产品吗?

SELECT * FR0M products AS p

JOIN products_tags AS pt ON pt.product = p.idproducts

JOIN tags AS tp ON tp.idtags = pt.tag and (tp.word = 'samsung' or tp.word = 'mobile')

JOIN tags AS tn ON tn.idtags = pt.tag and tn.word <> 'note1' and tn.word <> 'note2'

将是一种方式。

您的尝试不起作用,因为任何满足 in 子句的行都不可能满足 not in one。三星和手机都不是note1或note2

上面进行了一次连接以获取三星或移动设备,然后再次连接到标签表(使用不同的别名)以获取所有没有 note1 或 note2 标签的人。

于 2012-09-27T22:19:47.400 回答