Flask SQLAlchemy多对多关系下查询恰好包含指定n个队伍的比赛方法
Flask SQLAlchemy 多对多关系查询恰好包含指定队伍的比赛方案
核心逻辑
要实现查询恰好包含指定n个队伍的比赛,只需同时满足两个过滤条件即可:
- 目标比赛必须包含全部指定的队伍
- 目标比赛关联的队伍总数恰好等于n,无额外队伍
所有逻辑直接在数据库层完成,无需在内存中做交集或二次校验。
实现代码
假设你已拿到目标队伍的ID列表target_team_ids(如[T1.id, T2.id]),示例代码如下:
from sqlalchemy import func # 传入目标队伍ID列表,支持任意长度 target_team_ids = [T1.id, T2.id] n = len(target_team_ids) # 单条查询直接获取符合要求的比赛对象 matches = db.session.query(Match)\ .join(TeamMatchLink, Match.id == TeamMatchLink.match_id)\ .group_by(Match.id)\ .having( # 条件1:匹配到的目标队伍数量等于n,说明所有指定队伍都参与了该比赛 func.count(TeamMatchLink.team_id) == n, # 条件2:不存在不在目标列表内的队伍,说明无额外队伍参与 func.sum(TeamMatchLink.team_id.not_in(target_team_ids).cast(db.Integer)) == 0 ).all()
方案优势
- 执行效率高:所有过滤逻辑在数据库层面完成,避免了拉取全量数据到内存做交集和校验的性能损耗,数据量越大优势越明显
- 兼容性强:支持任意长度的目标队伍列表,无需修改代码逻辑,不会出现n增大后的循环嵌套问题
- 开箱即用:查询结果直接为符合要求的
Match对象列表,无需二次处理
内容的提问来源于stack exchange,提问作者Darina
相关产品推荐
相关产品推荐

