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)案例