多表联查分页

问题图:

问题图

数据库就是一个 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 好看好维护一些,还是查两次吧,第一次查数据,第二次查分页信息。

原文地址:https://www.cnblogs.com/seliote/p/14519394.html