假设我有一个带有Order ID和Student ID的2列的表:
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集的课程,。例如:
(1,2,3),则返回的课程ID应该是(1,4),因为只有这2门课程使集合中的所有学生都注册了。(1,2),则返回的课程ID应该是(1,3,4)。(2,3),则结果应该是(1,4,5)。等。
可以将学生ID集的大小更改到Python中的集合的极限。
目前,我正在查询特定的课程,并将对象存储到特定的列表中,然后使用Python进行筛选。然而,从上面的表格中多次查询数千个条目是非常缓慢的。
发布于 2020-01-14 19:37:57
这是一个有趣的解决方案,在PostgreSQL对我。看看我的DB Fiddle:
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 (未经测试),如下所示:
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()https://stackoverflow.com/questions/59740158
复制相似问题