多表查询

昨天到今天都在搞多表查询,可能是我经验不足,搞得头大阿,越想越烦,早上在地铁里,终于想明白了,原来没那么复杂。 一开始想的是对的,后来发现查询出多条重复记录,就开始左思右想是不是sql写的不对,关系搞错了。其实这样写就可以搞定了。

<select id="getAdminByAdminOrFunction" parameterClass="java.util.Map" resultClass="photo.central.po.admin.Admin">
  select DISTINCT a.* from admin_func_ref af
  left join admin a on a.admin=af.admin
  where 1 = 1
  <dynamic prepend="and">
   <isNotEmpty property="admin">
     a.name like '%$name$%'
   </isNotEmpty>
  </dynamic>
  <dynamic prepend="and">
   <isGreaterThan property="functionId" compareValue="0">
    af.functionId = #functionId#
   </isGreaterThan>
  </dynamic>
 </select>

这样查询,很神奇的地方就是一个distinct,看前人的代码受到的启发。

接下来Count出查询出记录的条数。

 

<select id="countQueryAdmin" resultClass="java.lang.Integer">
  select count(DISTINCT a.admin) from admin_func_ref af
  left join admin a on a.admin=af.admin
  where 1 = 1
  <dynamic prepend="and">
   <isNotEmpty property="admin">
     a.name like '%$name$%'
   </isNotEmpty>
  </dynamic>
  <dynamic prepend="and">
   <isGreaterThan property="functionId" compareValue="0">
    af.functionId = #functionId#
   </isGreaterThan>
  </dynamic>
 </select>

 

唉 。。。。。。。。。。。。。。。。。

 

另外,在查询mysql手册 mysql 优化(4)里发现,当 LIMIT row_count 和 DISTINCT 一起联合起来时,MySQL在找到 row_count 条唯一记录后就不再搜索了。由此,此语句可以优化一下

<select id="getAdminByAdminOrFunction" parameterClass="java.util.Map" resultClass="photo.central.po.admin.Admin">
  select DISTINCT a.* from admin_func_ref af
  left join admin a on a.admin=af.admin
  where 1 = 1
  <dynamic prepend="and">
   <isNotEmpty property="admin">
     a.name like '%$name$%'
   </isNotEmpty>
  </dynamic>
  <dynamic prepend="and">
   <isGreaterThan property="functionId" compareValue="0">
    af.functionId = #functionId#
   </isGreaterThan>
  </dynamic>

    limit 1
 </select>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值