MySQL选择不同的地方

时间:2013-05-31 11:26:27

标签: mysql join where

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

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中的标记数。但这可能是矫枉过正的。除此之外,执行时间是优先事项。你怎么看?提前谢谢!

1 个答案:

答案 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