具有多个自联接的键值查询的mysql替代方法

时间:2018-02-08 16:27:01

标签: mysql sql key-value

我有一个带有数字过滤器的表(年龄,体重,工资等)。 由于我事先不知道过滤器,所以我必须使用键值对:

company
id, name
1, ACME

users
id, name, company_id
1, jon doe, 1

filters
id, user_id, filter, value
1, 1, 'age', 30
2, 1, 'weight', 82
3, 2, 'salary', 50000

我的查询检索属于特定公司的用户,并匹配一个或多个过滤条件的任意组合:例如

SELECT COUNT(*) FROM users, filters as age, filters as weight
WHERE age.user_id = users.id
AND weight.user_id = users.id
AND age.filter = 'age'
AND age.value = 30
AND weight.filter = 'weight'
AND weight.value = 100
AND users.company_id = 1

该表包含数百万行,我已尝试过filter,value,user_id列的所有可能的索引组合。 查询需要几秒到几分钟。

我的用例有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

这是你想要的吗?

select f.user_id
from filters f
where (f.filter, f.value) in ( ('age', 20), ('weight', 100) )
group by f.user_id
having count(distinct f.filter) = 2;