如何用Flask-SQLAlchemy实现左外连接查询用户无记录的谜题
左外连接实现查询指定用户无关联Result的Riddle数据
核心逻辑
以Riddle表为左表,和Result表做左外连接,关联时同时限定Result对应的用户ID为指定用户,最终筛选出连接后Result侧字段为空的Riddle记录,即为该用户没有对应Result关联的所有谜语数据。
代码实现
# 替换为你实际要查询的目标用户ID target_user_id = 1 unrelated_riddles = db.session.query(Riddle).outerjoin( Result, # 双条件关联:谜语ID匹配 + 结果记录属于目标用户 (Riddle.id == Result.riddle_id) & (Result.user_id == target_user_id) ).filter( # 左连接后Result侧为空,说明该用户没有对应关联记录 Result.id.is_(None) ).all()
注意:SQLAlchemy 中判断 NULL 推荐使用
is_(None)写法,兼容性更高,也可以写为Result.id == None。
扩展场景:查询用户未完成的谜语
如果需求调整为获取用户「未完成」的谜语,包括无关联Result、有关联Result但is_completed为False的情况,调整筛选条件即可:
uncompleted_riddles = db.session.query(Riddle).outerjoin( Result, (Riddle.id == Result.riddle_id) & (Result.user_id == target_user_id) ).filter( db.or_( Result.id.is_(None), Result.is_completed == False ) ).all()
内容的提问来源于stack exchange,提问作者Kromako Forsse
相关产品推荐
相关产品推荐

