二、多表联查

(一)案例介绍
  有四张表:用户表(user)、商户表(business)、订单表(orders)、订单评论表(comment),现在要根据“商户ID(businessId)”查询该商户的所有评论,怎么做?
(二)解决思路
  1.最开始的思路
  一开始,我想利用“商户ID(businessId)”查询出所有订单(orderList),在遍历所有订单,取出评论,组成评论集合。
  问题:这样每遍历一个订单,就需要连接一次数据库,执行一次查询,效率太低。

  2.思路改进
  查询出该商户的所有订单之后,把订单的id组成一个数组“Integer[] ids”,然后利用

    where id in(
    <foreach collection="ids" item="id" separator=",">
        id
    </foreach>
    )

一次性执行所有的查询语句。
  问题:在程序里我得先查询数据库得到所有订单,再根据查询的订单集合构建“待查询订单数组(Integer[] ids)”,依然需要连接2次数据库,执行2次查询,效率有所提高,但是还有改进空间。

  3.优化方案
  直接根据“商户ID(businessId)”进行多表联查,所有的操作都在数据库中完成,代码如下:

<select id="searchByPage" parameterType="Comment" resultMap="CommentMap">
        SELECT co.id,co.order_id,co.content,co.star,co.createTime,u.phone,b.title
        FROM `comment` co,orders o,`user` u,business b
        <where>
            AND co.order_id=o.id AND o.user_id=u.id AND o.business_id=b.id
            <if test="id != null">AND co.id=#{id}</if>
            <if test="orderId != null">AND co.order_id=#{orderId}</if>
            <if test="searchKey != null and !&quot;&quot;.equals(searchKey.trim())">
                AND (
                b.title LIKE CONCAT('%',#{searchKey},'%')
                OR  u.phone=#{searchKey}
                )
            </if>
            <if test="business != null and business.id != null">AND b.id=#{business.id}</if>
        </where>
        ORDER BY co.createTime ASC
    </select>

  优点:一次连接数据库,得出结果,减少了代码量,效率得到了提高!
  问题:方案3与方案2在大数据量的情况下,谁更快?这一点暂无法得到验证!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值