查找具有最大匹配属性的项目

时间:2015-07-18 08:57:17

标签: mysql sql entity-attribute-value

这是我的表结构 - 表名“propAssign”

(indexed)        (composite index for attributeName and attributeValue)
 productId     attributeName     attributeValue 
    1              Height             3
    1              Weight             1
    1              Class              X1
    1              Category           C1
    2              Height             2
    2              Weight             2 
    2              Class              X2
    2              Category           C1
    3              Height             3
    3              Weight             1
    3              Class              X1
    3              Category           C1
    4              Height             4
    4              Weight             5
    4              Class              X2
    4              Category           C3

我想要做的是,获取productId列表,按最大匹配属性 - 值对排序。在实际表中,我使用属性名称和值的数字ID,我在这里使用文本以便于表示。

因此,如果我想找到productId = 1的匹配产品,我希望它能找到最大匹配的产品(如Height = 3,Weight = 1,Class = X1和Category = C1)。可能没有任何100%匹配(全部4匹配),但如果有,它们应该先到,接下来是productId,它有3个属性匹配,然后是2等等。

如果需要,我可以添加更多索引,如果我没有,那就更好了,因为有数百万行。确切地说是MariaDB v10。

期望的结果 - 如果我尝试为productId = 1找到匹配的产品,它应该以相同的顺序返回以下内容。

productId
-----------
3
2

原因 - 3具有与1,2匹配的所有属性,2具有一些匹配,4具有不匹配。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合来首先检索具有最多匹配数的productId。

select productId, 
    count(case when attributeName = 'Height' and attributeValue='3' then 1 end)
    + count(case when attributeName = 'Weight' and attributeValue='1' then 1 end)
    + count(case when attributeName = 'Category' and attributeValue='C1' then 1 end) as rank
from mytable
group by productId
order by rank desc

上面的查询返回所有行,即使是0匹配。如果您只想返回包含1个或更多匹配项的行,请使用下面的查询,该查询应该能够利用您的复合索引:

select productId, count(*) as rank
from mytable
where (attributeName = 'Height' and attributeValue = '3')
or (attributeName = 'Weight' and attributeValue = '1')
or (attributeName = 'Category' and attributeValue = 'C1')
group by productId
order by rank desc