Mysql多表联查,查询结果出现重复的解决方法

场景在现:
根据业务需要,需要使用如下的命令进行多表联查:

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来进行查询结果的去重。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多表联查查询变慢时,可以通过建立索引来优化查询性能。下面是一些可以考虑的索引建立方法: 1. 单索引:对于参与联查的每个,检查单查询是否需要索引来优化性能。通常,可以在经常用于过滤、排序和连接的列上建立索引。 2. 联合索引:如果多个列经常同时用于联查条件,可以考虑创建联合索引。联合索引可以覆盖多个列,提高查询效率。但要注意不要过度使用联合索引,因为索引的维护也需要耗费资源。 3. 联接列索引:对于经常用于联接的列,可以创建索引以加快联查操作的速度。 4. 覆盖索引:如果查询只需要返回部分列的结果,可以使用覆盖索引来避免访问的数据行。覆盖索引只包含查询所需的列,可以减少磁盘IO和内存开销。 5. 优化查询语句:有时候,通过优化查询语句的结构和逻辑,可以减少对索引的需求,从而提高查询性能。例如,避免使用不必要的子查询、避免使用全扫描等。 在进行索引优化时,需要注意以下几点: - 不要过度索引:过多的索引会增加写入操作的开销,降低写入性能。 - 统计信息更新:及时更新的统计信息,以帮助优化器生成更好的查询计划。 - 注意索引列的数据类型和长度:选择合适的数据类型和长度,以减少索引的大小和内存开销。 - 定期检查索引的使用情况:检查慢查询日志或使用`EXPLAIN`语句来分析查询计划,判断索引是否被正确使用。 需要根据具体的查询场景和数据特点来进行索引优化,可以使用MySQL的`EXPLAIN`语句来分析查询计划,了解查询的执行情况,进而进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值