MySQL三表查询无法获取不匹配行:venueId=88的rd表数据缺失一行
解决MySQL多表查询丢失不匹配行的问题
你遇到的核心问题是连接类型用错了——内连接(INNER JOIN)只会返回所有关联表都有匹配数据的行,而你需要保留rd表中所有venueId=88的记录,哪怕对应的booking或shift表没有匹配项。
问题根源
你当前的查询应该是用了INNER JOIN关联booking(也就是你语句里的a表)和shift表,这就导致rd表中那一条找不到对应booking/shift记录的数据被过滤掉了,最终只返回2行。
解决方案:改用左连接(LEFT JOIN)
把rd表作为主表,用LEFT JOIN关联其他表,这样不管其他表有没有匹配数据,rd的所有行都会被保留,没有匹配的字段会自动填充为null,正好符合你期望的输出格式。
参考修改后的查询语句(根据你的需求调整了字段别名和关联逻辑,你需要根据实际表结构微调关联键):
SELECT a.booking_id AS bookingId, a.booking_meeting_room_id AS bookingMeetingRoomId, a.booking_venue_id AS bookingVenueId, rd.venue_id AS venueId, rd.rd_id AS rdId, rd.morningTotalGuest, shift.shift_id AS shiftId FROM rd -- 左连接booking表,保留rd的所有行 LEFT JOIN booking a ON a.booking_venue_id = rd.venue_id -- 左连接shift表,同样保留rd的所有行(关联键根据实际表结构调整) LEFT JOIN shift ON shift.rd_id = rd.rd_id WHERE rd.venue_id = 88;
关键注意点
- 关联条件放对位置:如果你的原查询里有针对
booking或shift的过滤条件(比如时间范围),一定要把这些条件放到LEFT JOIN的ON子句里,而不是WHERE子句。否则会把左连接的null结果过滤掉,变回内连接的效果。 - 确认关联键正确性:要保证
booking和rd、shift和rd的关联字段是正确的(比如我假设shift和rd通过rd_id关联,你需要根据实际表结构修改)。
这样调整后,rd表中3条venueId=88的记录都会被返回,没有匹配的booking/shift字段就会显示为null,和你期望的输出一致。
内容的提问来源于stack exchange,提问作者rh2018
相关产品推荐
相关产品推荐

