首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逐步过滤基于Sqlalchemy中列的表

逐步过滤基于Sqlalchemy中列的表
EN

Stack Overflow用户
提问于 2020-01-14 19:02:05
回答 1查看 71关注 0票数 0

假设我有一个带有Order IDStudent ID的2列的表:

代码语言:javascript
复制
Order ID | Student ID |
-----------------------
1        | 1
1        | 2
1        | 3
2        | 1
2        | 3
3        | 1
3        | 2
4        | 1
4        | 2
4        | 3
5        | 2
5        | 3
.....

在这里,这是一种多到多的关系:一门课程可以包括很多学生,一名学生可以注册多门课程。

问题是:,我想过滤包含特定学生ID集的课程,。例如:

  • 如果学生ID设置为(1,2,3),则返回的课程ID应该是(1,4),因为只有这2门课程使集合中的所有学生都注册了。
  • 如果学生ID设置为(1,2),则返回的课程ID应该是(1,3,4)
  • 如果学生ID设置为(2,3),则结果应该是(1,4,5)

等。

可以将学生ID集的大小更改到Python中的集合的极限。

目前,我正在查询特定的课程,并将对象存储到特定的列表中,然后使用Python进行筛选。然而,从上面的表格中多次查询数千个条目是非常缓慢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 19:37:57

这是一个有趣的解决方案,在PostgreSQL对我。看看我的DB Fiddle

代码语言:javascript
复制
SELECT "Order ID"
FROM enrollments
GROUP BY "Order ID"
HAVING ARRAY[1, 2, 3] <@ array_agg("Student ID")

对于不知情的人,上面的查询基本上是在Order ID上分组,并只在数组(1, 2, 3)完全包含在所有Student ID中的情况下进行过滤(当然)。

这可以转换为SQLAlchemy (未经测试),如下所示:

代码语言:javascript
复制
from sqlalchemy.dialects.postgresql import array, ARRAY, array_agg
session.query(Enrollments)
       .with_entities(Enrollments["Order ID"])
       .group_by(Enrollments["Order ID"])
       .having(array_agg(
               Enrollments["Student ID"],
               type_=ARRAY(Integer)
           )
           .contains([1, 2, 3])
       )
       .all()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59740158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档