我有一个表产品和一个表标签都有这些字段:
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语句强制它等于inputed中的标记数。但这可能是矫枉过正的。除此之外,执行时间是优先事项。你怎么看?提前谢谢!
答案 0 :(得分: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