我有一个表产品和一个表标签,它们都有这些字段:
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 语句强制它等于输入的标签数量。但这可能是矫枉过正。在执行时间之上是优先级。你怎么看?提前致谢!