为何带AND的LEFT JOIN查询与普通LEFT JOIN查询结果一致?
问题分析与解决方案
你在LEFT JOIN的ON子句中添加event_participant_link.participant_id = ?的写法逻辑有误,这不会过滤左表(event_participant_link)的行,所以结果条数和未加条件时一致。
为什么原写法不生效?
LEFT JOIN的核心逻辑是保留左表的所有行,ON子句的作用只是用来匹配右表(event)的数据。如果某行左表数据不满足ON里的额外条件,右表对应的字段会被填充为NULL,但左表的这行依然会被包含在结果集中,所以总记录数不会减少。
正确实现方式
方式1:用WHERE子句过滤(保留LEFT JOIN特性)
如果你需要保留该参与者的所有关联记录(哪怕对应的活动已被删除,event字段为NULL),应该把participant_id的过滤条件放到WHERE子句中:
joined_table = mydb.execute('SELECT * FROM event_participant_link ' 'LEFT JOIN event ON event_participant_link.event_id = event.event_id ' 'WHERE event_participant_link.participant_id = ?', [participant_id]).fetchall()
方式2:用INNER JOIN(仅返回存在对应活动的记录)
如果你只需要该参与者实际参加过的、且存在活动信息的记录,改用INNER JOIN更合适,此时条件放在ON或WHERE子句结果一致:
-- 条件放ON子句 joined_table = mydb.execute('SELECT * FROM event_participant_link ' 'INNER JOIN event ON event_participant_link.event_id = event.event_id ' 'AND event_participant_link.participant_id = ?', [participant_id]).fetchall() -- 条件放WHERE子句 joined_table = mydb.execute('SELECT * FROM event_participant_link ' 'INNER JOIN event ON event_participant_link.event_id = event.event_id ' 'WHERE event_participant_link.participant_id = ?', [participant_id]).fetchall()
内容的提问来源于stack exchange,提问作者Frank Harris
相关产品推荐
相关产品推荐

