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

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

问题

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

order表,订单表设计如下:

订单表

waybill表,运单表设计如下:

运单表

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


  
  
  
      
  
 


比如有两个订单,每个订单都对应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引起的分页不正确的问题)