MySQL三表INNER JOIN返回0条数据,两表连接正常,求排查原因
问题原因分析
背景回顾
表结构:
- 表a:仅包含
id字段 - 表b:包含
id、c_id两个字段 - 表c:仅包含
id字段
已知a.id和b.id存在匹配数据,且以下两个两表关联查询均能正常返回结果:
-- a与b关联,返回匹配的行 SELECT * FROM a INNER JOIN b ON a.id = b.id ; -- b与c关联,返回匹配的行 SELECT * FROM b INNER JOIN c ON c.id = b.c_id ;
但执行三表关联查询时返回0条数据:
SELECT * FROM a INNER JOIN b ON a.id = b.id INNER JOIN c ON c.id = b.c_id ;
核心原因
没有任何一行b表数据,同时满足两个关联条件:
- 该b行的
id能在a表中找到匹配项(符合第一个JOIN条件); - 该b行的
c_id能在c表中找到匹配项(符合第二个JOIN条件)。
换句话说:
- 和a表匹配的那些b行,它们的
c_id全不在c表中; - 和c表匹配的那些b行,它们的
id全不在a表中。
两个两表查询各自能返回数据,但它们的结果集没有交集,因此三表INNER JOIN(取三个表的共同交集)自然返回0条数据。
举个具体的例子:
- a表id:
[1, 2, 3] - b表数据:
(1, 4), (2, 5), (3, 6), (7, 7), (8, 8) - c表id:
[7, 8]
此时:
- 第一个两表查询返回b表中id为1、2、3的行,但这些行的c_id(4、5、6)都不在c表中;
- 第二个两表查询返回b表中id为7、8的行,但这些行的id(7、8)都不在a表中;
- 三表关联时找不到同时满足两个条件的行,所以返回0条数据。
内容的提问来源于stack exchange,提问作者user15348043
相关产品推荐
相关产品推荐

