gpt4 book ai didi

mysql - 使用 SQL 过滤

转载 作者:行者123 更新时间:2023-11-29 00:03:43 25 4
gpt4 key购买 nike

我正在尝试编写一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com