0

我有一个表产品和一个表标签,它们都有这些字段:

id | name
1  | chair
2  | table

还有一个链接表product_tags:

id | productId | tagId
1  | 1         | 1
2  | 1         | 2
3  | 2         | 1
4  | 2         | 2
5  | 2         | 3
6  | 2         | 4

产品显示在搜索结果中,如果用户勾选某些标签,可以缩小范围。因此,我需要一个查询来返回在 product_tags 中具有所有选定标签的产品列表。例如,在我上面的表格中,如果用户勾选了标签 1、2 和 3,那么查询应该只返回产品 2。

由于此查询中有很多其他联接只会使此问题变得更加复杂,因此假设我当前的查询(选择具有至少一个标签的所有产品 - 这需要更改为“拥有所有标签”)如下:

SELECT DISTINCT p.id, p.name
FROM products AS p
JOIN product_tags AS pt ON p.id = pt.productId
WHERE pt.tagId IN (tag1, tag2, tag3, ...) //the line that will be removed

我在想也许在 where 语句中使用 COUNT() 从标签列表中为每个产品找到 tagId 的数量,并有一个 WHERE 语句强制它等于输入的标签数量。但这可能是矫枉过正。在执行时间之上是优先级。你怎么看?提前致谢!

4

1 回答 1

1

使用HAVING子句查看产品是否具有所有标签。

SELECT p.id, p.name
FROM products AS p
JOIN product_tags AS pt ON p.id = pt.productId
WHERE pt.tagId IN (tag1, tag2, tag3)
GROUP BY p.id, p.name
HAVING count(DISTINCT pt.tagId) = 3
于 2013-05-31T11:30:17.520 回答