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

本文介绍了如何使用MyBatis和窗口函数ROW_NUMBER()在MySQL中实现按cid和pid分组,查询score大于给定值的最小记录。同时提供了适用于不同MySQL版本的优化SQL示例和调用方法。
摘要由CSDN通过智能技术生成

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`语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值