我在MySQL表中列出了产品属性,其中每行包含产品ID prod
和属性ID prop
。如果产品具有三个属性,则会为该产品生成三行。示例表:
prod | prop
-----+-----
1 | 1
2 | 1
2 | 2
2 | 3
3 | 2
3 | 4
如何找到哪些产品同时拥有属性#1和#2(产品#2)?
我能想到的唯一方法是每个属性选择一个内部连接,但我认为这样效率非常低。它是一个网站的搜索功能,必须在表中的10k行和10个请求的属性。
答案 0 :(得分:2)
SELECT prod
FROM tbl
WHERE prop IN (1, 2)
GROUP BY prod
HAVING COUNT(*) = 2
如果总会找到2个属性 - 那么INNER JOIN
会更有效率:
SELECT t1.p
FROM tbl t1
INNER JOIN tbl.t2 ON t2.prod = t1.prod
AND t2.prop = 2
WHERE t1.prop = 1
此查询尽可能高效的建议索引是复合(prop, prod)