Mybatis分组查询大于某值的最小值记录

MyBatis 查询字段score上,先后按cid和pid分组的, 大于某个给定值的最小的一条记录,例如下表:
cid pid score
c1 p1 200
c1 p2 205
c2 p1 101
c2 p1 207
c2 p1 230
输入 202,返回:
c1 p2 205
c2 p1 207
这两条数据。
原因:200,101都小于202,故不要;而230虽然大于202,但在cid=c2,pid=p1的情况下,已经有207这个数据,而207<230,故不取230.

并优化SQL查询。
注意数据库的兼容性,主要用Mysql


为了在MySQL数据库中实现这个查询,我们可以使用窗口函数`ROW_NUMBER()`来为每个`cid`和`pid`组合排序,并选择最小的`score`值。以下是一个优化后的MyBatis Mapper XML文件中的SQL查询示例:

```xml
<mapper namespace="YourMapper">

    <!-- 查询字段score上,先后按cid和pid分组的,大于某个给定值的最小的一条记录 -->
    <select id="getMinScoresGreaterThanValue" resultType="YourEntity">
        SELECT *
        FROM (
            SELECT
                cid,
                pid,
                score,
                ROW_NUMBER() OVER (
                    PARTITION BY cid, pid
                    ORDER BY score ASC
                ) as rn
            FROM your_table
            WHERE score > #{value}
        ) as subquery
        WHERE subquery.rn = 1
    </select>

</mapper>
```

在这个优化后的SQL语句中:
- `your_table`是你要查询的数据库表名。
- `score`是你要比较的字段名。
- `#{value}`是MyBatis的参数占位符,它会被方法调用时传递的参数值替换。
- `ROW_NUMBER() OVER (PARTITION BY cid, pid ORDER BY score ASC) as rn`:这是一个窗口函数,它为每个`cid`和`pid`分组内的记录分配一个唯一的序号,序号是根据`score`字段升序排列的。
- `WHERE subquery.rn = 1`:在外层查询中,我们只选择那些窗口函数返回的序号为1的记录,即每个`cid`和`pid`组合中`score`字段值大于给定值的最小的一条记录。

通过这种方式,我们避免了额外的子查询,从而可能提高查询性能。

最后,在你的业务逻辑中调用这个方法:

```java
List<YourEntity> minScores = yourMapper.getMinScoresGreaterThanValue(202);
```

这样,你就能得到每个`cid`和`pid`组合中`score`字段值大于202的最小的一条记录。如果分组字段中有任意一个为空或者不符合条件,那么该记录将不会被包含在结果中。

请注意,MySQL 8.0.16及以上版本支持窗口函数,如果你使用的MySQL版本低于这个版本,上述查询将无法正常工作。在旧版本的MySQL中,你可能需要使用其他方法来实现这个查询,例如使用子查询和`GROUP BY`语句。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 15:00:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 15:00:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 15:00:03       82 阅读
  4. Python语言-面向对象

    2024-03-11 15:00:03       91 阅读

热门阅读

  1. 计算机网络-H3C 交换机FTP与TFTP

    2024-03-11 15:00:03       41 阅读
  2. 学习Android的第二十五天

    2024-03-11 15:00:03       40 阅读
  3. Webpack、Vite在Vue项目中常用的用法

    2024-03-11 15:00:03       38 阅读
  4. C++——内存管理、模板

    2024-03-11 15:00:03       41 阅读
  5. C++之string

    2024-03-11 15:00:03       35 阅读
  6. Android Jetpack:概述、优劣分析及其应用场景探索

    2024-03-11 15:00:03       44 阅读
  7. LightDB24.1 oracle_fdw支持服务端GBK编码

    2024-03-11 15:00:03       49 阅读
  8. ASPICE SYS3架构设计文档编写规范

    2024-03-11 15:00:03       44 阅读