mysql为什么我的left join之后比查单表数据行更多?

【1】问题情况

  

 结果1:812815  结果2:812864    

为什么?不是 left join 怎么都会是左表的全集吗?怎么还能比全表多出来不少?

【2】解析

(2.1)当辅助表比 left join 主表匹配行多时

  很明显,这个问题是因为  on 中的条件 tv.ticket 与 tvr.ticket 并不是一一对应且唯一,辅助表 tvr.ticket 必定是有重复值多行存在。

   tv.ticket 1 对  tvr.ticket 多,甚至是多对多,所以左表会多出行来,不然匹配上的难道你哪一行不要吗?

不信?举个例子看看,如下图:

  

  我们可以看到,t1表是 left join 左表,那么它只有 1 2 3 ,3行,但在匹配过程中 t2 表有值 3个1

  3个1都匹配上了左表的,按照匹配上的笛卡尔积,每一次匹配都会对应生成一行,也就是生成 1*3 行

  最终结果当然是3个1。

要是再来一个,左表 t1 是2个1,右表 t2  还是3个1,那么就会配置后值笛卡尔积道理生成 2*3 的6行数据

  

(2.2)当辅助表比 left join 主表匹配行少时

我们改成 right join ,那么 t2为主表,如下图,我们发现情况还是一样的。

  

【3】结论

1、left join 时,只有当主表与辅助表的关联条件所在字段没有重复值时,即均为 1对1 或 1对0,那么显示的才是主表全表内容。

2、无论是 left join 还是 right join ,在关联条件所在值是 1 对 多、多对多时,那么针对匹配的该值,都是 1*N 或 N*N ;具体见(2.1)案例

 

posted @ 2022-09-01 15:37  郭大侠1  阅读(3623)  评论(0编辑  收藏  举报