美文网首页
sql用exists来解决left join引起的分页不正确的问

sql用exists来解决left join引起的分页不正确的问

作者: 刘振宁的博客 | 来源:发表于2019-01-24 12:31 被阅读28次

    巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。
    这是对的,但是我没有说过这句话! —— 鲁迅

    问题

    列表查询中经常会关联多个表查询,会用到 left joininner join 等来关联表。
    但是假如两个表之间的关系是 1对多 的话,查询结果就会按 的那一方来。
    而假如我们想要的查询结果是 1 那一方的话,用 mybaties等工具,可以生成 1 的对象,里面可能包含 方的一个list.
    比如:

    order表,订单表设计如下:

    订单表

    waybill表,运单表设计如下:

    运单表

    order和waybill的对应关系为1对多,即一个订单对应多个运单,waybill表中的orderid = 订单表中的id。
    查询如下:

    <resultMap id="hddOrderOut" type="com.enn.zhwl.tms.dal.entity.hdd.HddOrderOut">
      <result column="id" property="id"/>
      <result column="order_no" property="orderNo"/>
      <collection property="waybills" ofType="com.enn.zhwl.tms.dal.entity.Waybill">
          <result property="waybillNo" column="waybill_no" />
      </collection>
    </resultMap> 
    
    <select id="findHddOrders" resultMap="hddOrderOut" parameterType="java.util.Map">
            SELECT
            o.id,o.order_no,
            w.waybill_no
            FROM
            `order` o
            left join waybill w on w.order_id = o.id
    where  w.waybill_no like '%aa%'
    </select>
    

    比如有两个订单,每个订单都对应5个运单,那查出来,就是两个 HddOrderOut 对象.
    但是假如加入分页的话,就有问题了,由于sql直接查出来的是10条数据,而不是两条数据,导致总数不一致,分页出现问题。

    解决方法

    直接查相应的order信息,然后再跟进order的id,去查询waybill的信息.

    但是假如查询条件有waybill的信息怎么办,比如 where w.waybillno like '%aa%' , 那怎么办.
    这时候就可以用exists,单单将查询条件加进去,,查询的结果,却只选择 1 这一方的数据。如下:

    SELECT o.id,o.order_no
    FROM
    `order` o
    where exists(
     select 1 from waybill w where w.order_id = o.id and  w.waybill_no like '%aa%'
    )
    

    然后再将查询到的Id,去对应查询相应的运单信息 waybill。

    注意事项

    用订单id,去查询运单的时候,也要将相应的之前的 查询条件带进去,如下:

    SELECT * FROM
    waybill w
    where w.order_id = 123 and w.waybill_no like '%aa%'
    

    原因是订单对应的5个运单中,可能只有3个满足需求.

    相关文章

      网友评论

          本文标题:sql用exists来解决left join引起的分页不正确的问

          本文链接:https://www.haomeiwen.com/subject/rkyyjqtx.html