mysql - 使用 SQL 过滤

标签 mysql sql search filtering

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

相关文章:

php - SQL 如果值类似于多列,则选择该列

MySQL 插入 [Err] 1136 - 列计数与第 1 行的值计数不匹配

mysql - 为每个唯一列值选择不禁止用户的最短时间

PostgreSQL Multi-Word-String 比较超时

php - SQLite 在通过 URL 访问时显示数据

mysql - 设计在线评估数据库的更好方法

php - SQL中有返回 "All"的符号吗

php - 使用 PHP 和 MYSQL 数据库查找不在另一个表中的结果?

mysql - 将引用表连接到基表以外的表

mysql - MATCH AGAINST 在没有连接的情况下跨多个表