我正在尝试编写一个 SQL 查询来过滤数据集中的人员。
有一些“方面”,比如“这个人多大了?”、“这个人有多高?”。
每个方面都有一些“桶”。例如,“几岁?”方面可能有桶“0-20”、“21-40”、“40+”。
有一些“成员资格”,这是一个连接表,用于说明一个人属于特定的桶。
我的模型是这样的:
Facet
|
/|\
Bucket
|
/|\
Membership
\|/
|
Person
我遇到困难的部分是,为了能够进行过滤,我需要在各个方面进行交集。
例如,我希望能够为“几岁?”选择“0-20”和“21-40”。和“0-140”代表“多高?”。返回的人应该是:
(桶“0-20”中的人或桶“21-40”中的人)和桶“0-140”中的人
我不太确定该怎么做。我可以使用“IN”子句轻松地完成“OR”,例如IN (1, 2, 3),但我不确定“AND”。我看到 SQL 有一个“INTERSECT”关键字,但我不确定这是否是正确的方法。
非常感谢任何帮助。
谢谢
编辑:这是(简化的)架构:
方面:id
桶:id,facet_id
成员资格:person_id, bucket_id
人:id
所有字段都是整数。
编辑:这是我迄今为止最好的查询。
select group_concat(p.id) as "people for facet",
b.facet_id from people p
join memberships m on m.person_id = p.id
join buckets b on m.bucket_id = b.id
where b.id in (1, 3)
group by b.facet_id;
我现在需要将“people for facet”结果相交。
最佳答案
假设任何给定的桶只是单个方面的一部分,那么有一个非常优雅的解决方案。挑战在于以正确的方式看待问题。所以,如果您想要匹配您所有方面的用户,
select b.userid
from buckets b
where b.bucketid in ( . . . )
group by b.userid
having count(distinct b.facetid) = # of facets;
想法是您有一个存储桶列表并代表您想要的方面。您希望确保每个“方面”至少有一个匹配的存储桶,这就是 having
子句的作用。
关于mysql - 使用 SQL 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28499029/