mysql - 使用SQL筛选

  显示原文与译文双语对照的内容
0 0

我正在尝试编写一个SQL查询来过滤数据集中的人。

有一些"侧面",它们是像"这个人有多大","这个人有多高"之类的东西。

每个方面都有一些"桶"。 例如"多旧啊"方面可能有桶" 0 -20"。" 21 -40"。" 40 +"。

有一些"会员",它是一个 Join 表,用于表示某个人属于特定的桶。

我的模型如下所示:


 Facet
 |
/|
 Bucket
 |
/|
Membership
 |/
 |
 Person

我所努力的部分是能够做过滤器,我需要做一个交叉的方面。

例如,我希望能够为"多高"选择" 0 -20"和" 21 -40"为"多旧啊"和" 0 -140"。 返回的人应该是:

( 桶" 0 -20"或者桶" 21 -40"中的人) 和桶中的人"0-140""

我不确定该怎么做。 我可以用"in"子句,( 1,2,3 ),但我不确定这个函数,轻松地完成"或者或或者"。 我看到SQL有"相交"关键字,但我不确定这是不是正确的方法。

任何帮助都非常有用。

谢谢

编辑: 下面是( 简化) 模式:

侧面:id

桶:id,facet_id

会籍:person_id,bucket_id

人员:id

所有字段都是整数。

Edit: 这是我目前最好的查询。


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;

我现在需要把"面向方面的人"结果合并在一起。

时间: 原作者:

0 0

假设任何给定的bucket仅仅是单个方面的一部分,那么就有一个非常优雅的解决方案。 挑战在于正确地看待问题。 所以如果你想让那些符合你所有观点的用户


select b.userid
from buckets b
where b.bucketid in (.. . )
group by b.userid
having count(distinct b.facetid) = # of facets;

这个想法是你拥有一个bucket列表,并表示你想要的各个方面。 你要确保每个"侧面"至少有一个匹配的bucket,这就是 having 子句所做的。

原作者:
0 0

谢谢你Gordon我终于收到了 ! 你的topsy-turvy思考这个问题的方法。

以下是我的解决方案:


select p.* from memberships m
join people p on m.person_id = p.id
join buckets b on m.bucket_id = b.id
where b.id in (1, 3)
group by m.person_id
having count(distinct b.facet_id) = (
 select count(distinct b.facet_id) from buckets b
 where b.id in (1, 3)
);

输入是 buckets ( 1,3 )的列表。

我使用子查询来计算这些bucket的面数。 也许有更高性能的方法,但我认为这将很快被执行。

我将在一个大型数据集上测试它,并看看它是如何执行的。

再次 感谢 。

原作者:
...