0

我在 MySQL 表中列出产品属性,其中每一行都包含一个产品 IDprod和一个属性 ID prop。如果产品具有三个属性,则该产品会产生三行。示例表:

prod | prop
-----+-----
1    | 1
2    | 1
2    | 2
2    | 3
3    | 2
3    | 4

我怎样才能找到哪些产品同时具有属性#1 和#2(产品#2)?

我能想到的唯一方法是每个属性一个选择和内部连接,但我认为这将非常低效。它是一个网站的搜索功能,必须适用于表中的 10k 行和 10 个请求的属性。

4

1 回答 1

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)

于 2012-05-06T10:17:37.523 回答