zoukankan      html  css  js  c++  java
  • 多表联查分页

    问题图:

    问题图

    数据库就是一个 goods_comment 表与一个 goods_comment_image 表,关系为一对多,且可为一对零,goods_comment_image 中的 goods_idgoods_comment 的主键 id 外键,想要把评论及其带的图拉取出来并按照评论分页,想要的结果映射到 Model 如下:

    Model

    • 第一条 SQL:没有 COUNT(*) 查出的数据是正确的,但是我需要 COUNT(*) 来指示总数用于分页,所以需要继续添加

    • 第二条 SQL:没加 GROUP BY COUNT(*) 了选择出来的总数据,首先条数不对,我应该 COUNT(*) goods_comment 记录数而不是和 goods_comment_image 联表后的记录数,而且这里有一个问题,记录数应该是 3 条,而不是显示的 1 条

    • 第三条 SQL:加上 GROUP BY,还是少了一条数据,但是结合 COUNT(*) 不难看出少的一条数据被分组吃掉了,而且对比第二条 SQL 好像 GROUP BY 后多条数据需要取出一条时,结果是随机的

    几个点:

    1. MySQL/MariaDB 的聚合函数如 COUNT 可以省略 GROUP BY 子句,但是标准 SQL 是不允许的,会报错 SELECT 的列必须在聚合函数或 GROUP BY 内
    2. COUNT 应该放进子查询里,毕竟是按照 goods_comment 分页而不是 goods_comment_image
    3. 上面聚合函数的使用会进行分组,导致结果里少数据,选出来的只会是按照 GROUP BYORDER BY 后最上面的一条

    正确的 SQL

    正确图

    可以看到 COUNT 移到子查询里且使用窗口函数避免数据被吞。

    还有一个问题,当没有评论的时候呢,SELECT 将会返回空,但是我希望会返回相应的页数,但是实际上这里会返回空。

    修改完 MyBatis 映射如下

    属实看着恶心,但又没有其他办法。

    如果想要 SQL 好看好维护一些,还是查两次吧,第一次查数据,第二次查分页信息。

  • 相关阅读:
    vue-cli + webpack 构建vue.js开发环境
    JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)
    总结下var、let 和 const 的区别
    vue双向绑定原理
    Vue中computed和watch的区别
    前端面试题总结
    微信开发之上传素材
    微信开发之向用户群发文本消息
    微信开发之获取用户详细列表
    TPshop入门大纲
  • 原文地址:https://www.cnblogs.com/seliote/p/14519394.html
Copyright © 2011-2022 走看看