匹配表中的多行相同列 - MySql

时间:2015-08-24 08:20:30

标签: mysql performance

我有一张表格如下。

+------------+-------------+---------+
| productid  | attributeid | valueid |
+------------+-------------+---------+
| 1011052312 |      331100 | 1543697 |
| 1011052312 |    33113319 | 1534108 |
| 1011098009 |       33129 | 2655849 |
| 1011052380 |      331100 | 1543697 |
| 1011052380 |    33113319 | 1233908 |
+------------+-------------+---------+

现在我只需要获取那些具有非常精选的属性值对的productid。比方说,我需要获取属性331100的值为1543697且属性33113319的值为1534108的产品。产品1011052312满足此条件。

需要注意的一点是,我应该避免多个连接,因为我需要匹配一长串属性。对于每个属性,可以有任意数量的可能值。

2 个答案:

答案 0 :(得分:1)

这是一个常见问题,选择所有匹配至少一个属性的产品,对它们进行分组,计算每个产品的属性数量,然后使用HAVING子句仅选择具有所有属性的产品。像这样:

SELECT productid
FROM table
WHERE (attributeid=331100 and valueid=1543697)
OR (attributeid=33113319 and valueid=1534108)
GROUP BY productid
HAVING COUNT(*) = 2

答案 1 :(得分:0)

另一种说同样事情的方式 - 我无法记住EXPLAIN是否相同,所以这可能会更慢......

SELECT productid 
  FROM my_table 
 WHERE (attributeid,valueid) IN ((331100,1543697)
                                ,(33113319,1534108)
                                )
 GROUP
    BY productid
HAVING COUNT(*) = 2;