使用表连接,连接中间表时必然会出现笛卡尔积
中间表就是一个多对多的关系两张表生成的中间表。再关联查询这张中间表时必然会出现笛卡尔积,导致重复数据。这是必然的。因为多对多的关系,A表可以有多个B表的数据,B表可以有多个A表的数据。那么查询时就会出现笛卡尔积。即使目前还没出现,那日后也会因为量变引发质变。
解决方式:
1、用临时表分组
比如
select
from
( 和中间表联查的select ) temp
group by xxx
这种方式就是先查出来了,然后把这个结果集当成临时表再进行分组。缺陷显而易见,创建临时表效率肯定不好。
2、在业务层组装数据
先查中间表的数据,并且分好组。得出关联表的字段,比如:id。然后再用这个id去查需要的数据。就是把sql拆分出来。在业务层组装
比如:
-- 中间表得到id
select bizId from 中间表 group by bizId
-- 通过id再去查需要的数据
select id, title, cove_img ... from 业务表 where id in (xxx, xxx, xx)