场景在现:
根据业务需要,需要使用如下的命令进行多表联查:
SELECT
r.id,
r.goods_id,
r.goods_description,
r.brand_name,
r.supplier_code,
r.supplier_name,
r.goods_images,
r.goods_nake_price,
r.goods_price,
r.goods_code,
r.buyer_id,
r.needer_id,
r.need_num,
r.buy_num,
r.`status`,
r.handle_time,
r.order_id,
r.order_number,
r.purchase_number,
r.is_enable,
r.create_time,
r.update_time,
org.organization_short_name AS orgName,
r.buy_num * r.goods_price AS rowTotalPrice
FROM
shop_requirement r
LEFT JOIN system_organization_purchase_contract org ON org.organization_id = r.organization_id
AND org.tenant_id = 1
WHERE
r.is_enable = '1'
AND r.needer_id = '3609'
AND r.tenant_id = 1
ORDER BY
r.create_time DESC
查询结果是同一条数据都出现了重复
解决方法:
当时直接想到的是加DISTINCT或者在sql语句末尾添加group by进行去重,效果确实能够达到效果。
但是不能只知其然,后来发现,是自己LEFT JOIN的表没有关联主键,org.organization_id字段不是唯一值导致,那么根据笛卡尔积,left join 将会产生m * n条数据,会重复n倍。
所以,使用多表联查时尽量关联到主键上或者具有唯一约束的字段上,或者可以习惯性的加上DISTINCT来进行查询结果的去重。