mysql关联查询出现的数据不准确问题
主要还是自己对sql语句的掌握程度太低了,还需要多多加强sql语句编写,最初我的语句是这样写的:
<select id="selOrdersByOid" parameterType="String" resultMap="selOrders">select orders.aid as oaid ,orders.date as odate,orders.oid,orders.order_number,orders.state as ostate,orders.total, orders.uid as ouid,address.addr,address.aid,address.code,address.date as addrdate ,address.`name` as addrname,address.province,address.region,address.state as addrstate,address.tel,address.uid as addruid,order_item.order_item_id,order_item.pid as oipid,order_item.count,order_item.sub_total,order_item.oid as oioid,order_item.date as oidate,product.pid,product.state as pstate,product.pname,product.pdesc,product.date as pdate,product.csid,product.market_price,product.shop_price,product.sales,product.stock,image.image_id,image.name as imgname,image.old_name,image.path,image.date as imgdate,image.pid as imgpid,image.state as imgstatefrom ordersINNER JOIN addresson orders.aid = address.aidLEFT JOIN order_itemon orders.oid = order_item.oidleft join producton order_item.pid = product.pidleft join imageon image.pid = product.pid<where><include refid="orderSql"/></where>limit #{startIndex},#{pageSize}</select>//sql片段<sql id="orderSql">and orders.uid = #{ouid}<if test="ostate !=null and ostate != '' and ostate!= 0">and orders.state = #{ostate}</if></sql>
也是无意间发现数据不准确,起初还没发现问题所在。。。。。
后来改了下sql:
<select id="selAllOrdersbByUid" parameterType="PageBean" resultMap="selOrdersByUser">SELECT * from(select orders.aid as oaid ,orders.date as odate,orders.oid,orders.order_number,orders.state as ostate,orders.total, orders.uid as ouidfrom orders<where><include refid="orderSql"/></where>limit #{startIndex},#{pageSize}) as ordLEFT JOIN(select order_item.order_item_id,order_item.pid as oipid,order_item.count,order_item.sub_total,order_item.oid as oioid,order_item.date as oidate,product.pid,product.state as pstate,product.pname,product.pdesc,product.date as pdate,product.csid,product.market_price,product.shop_price,product.sales,product.stock,image.image_id,image.name as imgname,image.old_name,image.path,image.date as imgdate,image.pid as imgpid,image.state as imgstatefrom order_itemleft join producton order_item.pid = product.pidleft join imageon image.pid = product.pid) as orderExton ord.oid = orderExt.oioid</select>//sql片段<sql id="orderSql">and orders.uid = #{ouid}<if test="ostate !=null and ostate != '' and ostate!= 0">and orders.state = #{ostate}</if></sql>
###想实现的功能是订单的分页,每页显示12条订单数据
最初的写法导致了我每页显示的数据个数都不统一,多少个都有可能,但是我的分页算法是指明了的每页显示12条数据,这也是我发现问题的原因。。。
分析:
1,因为最初的写法是将所有的表进行关联了,关联查询后我进行了limit ,这时的关联查询会查出很多结果,毕竟订单下有订单项,订单项下有商品,商品下还要对应多张图片,。。。此时我进行的截取肯定也是查询出了这么多的结果集之后进行的,这时候在取12条数据也就是几个订单的结果,肯定不会是12个订单的结果了,x下面展示的是将最初的语句查询结果
##最初的查询语句:
select orders.aid as oaid ,orders.date as odate,orders.oid,orders.order_number,orders.state as ostate,orders.total, orders.uid as ouid,address.addr,address.aid,address.code,address.date as addrdate ,address.`name` as addrname,address.province,address.region,address.state as addrstate,address.tel,address.uid as addruid,order_item.order_item_id,order_item.pid as oipid,order_item.count,order_item.sub_total,order_item.oid as oioid,order_item.date as oidate,product.pid,product.state as pstate,product.pname,product.pdesc,product.date as pdate,product.csid,product.market_price,product.shop_price,product.sales,product.stock,image.image_id,image.name as imgname,image.old_name,image.path,image.date as imgdate,image.pid as imgpid,image.state as imgstatefrom ordersINNER JOIN addresson orders.aid = address.aidINNER JOIN order_itemon orders.oid = order_item.oidleft join producton order_item.pid = product.pidINNER join imageon image.pid = product.pidWHERE orders.uid = 'ffef0a7cd0484739b06c8c6dd83f0c13' and orders.state =1 limit 0 ,10
可以看到查询出的10条结果中前三条就出现了同一个订单的情况,这时候在去封装也就是8个订单了,并不是10个订单,也就解释通了为什么前台每页最初展示的订单个数都是不同的了,如果恰巧有一个订单正好10个订单项,而且就在数据截取的第一个时,那么这页就只有这一个订单了。
下面展示一下正确的做法,因为我要查询订单,所以查询要以订单为主,先去查订单,然后在去和订单项,商品,图片什么的去关联,这时候在去查询就对了,而且这时查询出的数据不止十条,因为每个订单项中可能不仅只有一个商品。
SELECT * from(select orders.aid as oaid ,orders.date as odate,orders.oid,orders.order_number,orders.state as ostate,orders.total, orders.uid as ouidfrom ordersWHERE orders.uid = 'ffef0a7cd0484739b06c8c6dd83f0c13' and orders.state =1 limit 0,10) as ordLEFT JOIN(select order_item.order_item_id,order_item.pid as oipid,order_item.count,order_item.sub_total,order_item.oid as oioid,order_item.date as oidate,product.pid,product.state as pstate,product.pname,product.pdesc,product.date as pdate,product.csid,product.market_price,product.shop_price,product.sales,product.stock,image.image_id,image.name as imgname,image.old_name,image.path,image.date as imgdate,image.pid as imgpid,image.state as imgstatefrom order_itemleft join producton order_item.pid = product.pidleft join imageon image.pid = product.pid) as orderExton ord.oid = orderExt.oioid
可以看到正确的查询结果,结果一共28条订单项数据,完美!加油!!!!
mysql关联查询出现的数据不准确问题相关推荐
- mysql关联查询操作表最新数据
mysql关联查询操作表最新数据 mysql关联查询操作表最新数据的几种方式(max,order by)和性能分析,再数据量较多,关联ID存在索引的情况下建议使用方式二,速度更快.具体请看SQL及EX ...
- Mysql 关联查询的优化 及 子查询优化
Mysql 关联查询的优化 left join ①EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card; ②如何优化 ...
- mysql如何查询昨天的数据
mysql如何查询昨天的数据 假设localdate为时间字段 select * from user where date(localdate) = date_sub(curdate(),interv ...
- MySQL关联查询 COUNT数据不准确
前提 在业务开发中常遇到关联查询使用count()函数做统计的需求,同样在使用该函数时如果处理不当会导致统计出的数据是真实数据N倍的问题,出现重复问题导致统计不准确.出现该问题的原因是关联查询的主表与 ...
- mysql pdo 查询一条数据,使用 PDO 关联查询 MySQL 数据
使用pdo关联查询mysql数据 try { $pdo = new PDO('mysql:host=localhost;dbname=test;', 'root', '123456'); // 0.等 ...
- mysql 关联查询_mysql数据库调优(二)
第五.查询优化 1.查询慢的原因:网络因素.CPU.IO.上下文切换.系统调用.生成统计信息.锁等待时间等 2.优化数据库访问:查询性能地下的原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据 ...
- mysql 关联查询_响应时间长?MySQL查询优化教程来了!
- 点击上方"爱数据学习社"关注我们吧! - 为什么查询会慢?--响应时间过长. 如果把查询看做是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询, ...
- mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了
优化器的作用: 我们知道,一条SQL语句,可以有很多执行方式,最后都返回相同的结果,而优化器的作用就是找到最好的执行计划. 一.RBO-基于规则的优化器(rule) 系统内置的一套硬编码规则,根据规则 ...
- MySQL关联查询时,我们为什么建议小表驱动大表?
作者:留兰香丶 blog.csdn.net/codejas/article/details/78632883 有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们 ...
最新文章
- BAD SLAM:捆绑束调整直接RGB-D SLAM
- Cisco路由器的安全配置简易方案
- 18B树、B++树和Trie树
- 工作288:跨组件传值
- Android okhttp3使用实例,OKhttp设置请求超时时间,okgo使用demo
- 【HDU - 5455】Fang Fang(水题,有坑)
- opencv介绍+python调取图片
- 雪城大学信息安全讲义 五、竞态条件
- Activemq MQTT 简单消息推送示例
- 微信第三方平台相关的转发
- 用jsonp 解决跨域问题
- 苹果mac菜单栏应用管理软件Bartender 让Mac选项列不再拥挤
- 线程(一)__同步以及死锁
- php怎么跟小程序链接,小程序的链接怎么提取?
- 关于StopSelf
- 非标机械设计老工程师的经验总结,还不赶紧收藏
- vue+ydui使用iconfont时图标不显示
- 深度linux怎样设置显卡,在Deepin系统中安装英伟达NVIDIA显卡驱动的方法
- 如何用串口助手测试软件485通讯功能,串口调试助手如何检测RS485端口好坏及信号发送的好坏?...
- 下载喜马拉雅FM的音频