这是我的表结构 - 表名“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具有不匹配。
答案 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