我有三张桌子。
User:
[
user_id
first_name
last_name
]
Picture:
[
filename
picture_type // eg: painting, photograph
painter
]
Comment
[
user_id
filename
comment
]
我正在尝试查询当前用户未审核的所有文件名。
以下行返回在给定picture_type
中审核和评论的所有文件名session.query(Picture.filename).outerjoin(Comment).filter(
Picture.filename == Comment.filename,
Picture.picture_type == 'photograph'
).all()
,以下行返回给定picture_type
中的所有文件名session.query(Picture.filename).outerjoin(Comment).filter(
Picture.picture_type == 'photograph'
).all()
我期待以下行会返回给定picture_type中未审核的文件名,但会返回一个空列表
session.query(Picture.filename).outerjoin(Comment).filter(
Picture.filename != Comment.filename,
Picture.picture_type == 'photograph'
).all()
我在这里做错了吗?我在这里缺少什么?
答案 0 :(得分:1)
我认为你的代码有语法错误。你错过了一个点吗?你写道:
session.query(Picture.filename)outerjoin(Comment).filter(
Picture.filename == Comment.filename,
Picture.picture_type == 'photograph'
).all()
但它应该是这样的:
session.query(Picture.filename).outerjoin(Comment).filter(
Picture.filename == Comment.filename,
Picture.picture_type == 'photograph'
).all()
其他部分也存在此问题
答案 1 :(得分:0)
我研究了Exclusive Join并找出了问题。
应该是无== Comment.filename ,而不是 Picture.filename!= Comment.filename 。
我修改了代码,如下面的代码,它现在正在运行。
session.query(Picture.filename).outerjoin(Comment).filter(
None == Comment.filename,
Picture.picture_type == 'photograph'
).all()
问题是左外连接的结果表没有任何符合 left_field!= right_field 条件的行。生成的行符合 left_field == right_field 或 None == right_field 条件,因为右表中的缺失值将标记为 null 结果表。
以下链接让我对这个主题有了很好的了解。
http://www.datasavantconsulting.com/roland/sql_excl.html
感谢所有人的帮助。
但是,我仍然愿意接受更好的建议!!!