MySQL中表连接的实际工作原理?主表行重复连接疑问解析
表连接的行数误区:单行可被多次匹配连接
我之前也一直抱着一个错误认知:表连接时,主表的一行在应用条件后只会和目标表的一行关联,所以想当然觉得查询结果的行数肯定不会超过主表的行数。直到实际处理嵌套分类的层级统计时,才发现这个想法大错特错——当连接条件允许时,主表的一行是可以被多次匹配、多次连接的!
举个实际例子,就是这段用来计算嵌套分类层级深度的查询(补全了你没写完的部分,不然COUNT逻辑没法正常工作):
SELECT node.name, (COUNT(parent.name) - 1) AS depth FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name
如果按照我之前的错误理解,觉得node表的每一行只会和parent表的一行匹配,那COUNT(parent.name)的结果永远是1,减1后所有分类的depth都会是0,这显然不符合实际的层级结构。但真实情况是,每个节点会匹配所有它的祖先节点(包括自身),所以node的一行会和parent表的多行建立连接,COUNT统计的正是匹配到的祖先总数,减1之后才得到了正确的层级深度。
这里总结几个关键要点:
- 表连接的行数没有“主表单行最多关联目标表一行”的限制,完全由连接条件决定
- 当连接条件是范围匹配、多值匹配这类场景时,主表单行会被多次连接,最终结果行数可能远超主表行数
- 这种特性是处理树形结构、层级统计的核心,比如嵌套集模型(Nested Set Model)就是依靠这个原理来计算节点深度的
内容的提问来源于stack exchange,提问作者Cholthi Paul Ttiopic
相关产品推荐
相关产品推荐

