group by 获取总记录数

SQL中使用GROUP BY 获取总记录数与生成分页技巧
本文介绍了在SQL中利用GROUP BY 和相关查询语句实现获取总记录数并据此生成分页的方法。适用于不同场景,包括处理distinct列、having条件、以及子查询的应用。

 

sql中有group buy 后如何获取总记录的条数,来生成分页

当然一般情况下我是不推荐这样的分页,如果你真的需要应该是你表结构设计有问题

1、适用于所有情况

$db = new PDO(DSN...); 
$db->setAttribute(array(PDO::MYSQL_USE_BUFFERED_QUERY=>TRUE)); #必须开启查询缓存
$rs  = $db->query('SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 5,15');  #SQL_CALC_FOUND_ROWS  会忽略limit
$rs1 = $db->query('SELECT FOUND_ROWS()');
$rowCount = (int) $rs1->fetchColumn();

 

2、适用于没有having的条件情况

select count(distinct(column)) from table #可以用到索引

 

3、子查询

select count(*) from (select dealer_id  from card GROUP BY dealer_id)as tmp;

 

 

 

### 使用 LambdaQueryWrapper 进行分组查询以获取最新记录 为了使用 `LambdaQueryWrapper` 在 MyBatis-Plus 中执行分组查询并获得每个分组中的最新记录,可以通过组合 SQL 函数和条件来实现这一目标。下面是一个具体的例子说明如何操作。 假设有一个名为 `UserRecord` 的表,其中包含用户的活动日志信息,并希望按用户 ID (`userId`) 分组,找到每组中时间戳(`timestamp`)最大的那条记录作为该用户的最近一次活动记录。 #### 创建实体类 首先定义对应的实体类: ```java public class UserActivity { private Long id; private Integer userId; // 用户ID private Date timestamp; // 时间戳 } ``` #### 编写 Mapper 接口方法 接着,在相应的 Mapper 文件里声明一个自定义的方法签名用于接收特定类型的返回值列表: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserActivityMapper extends BaseMapper<UserActivity> {} ``` #### 构建查询语句 最后编写服务层逻辑或测试案例里的代码片段完成实际的数据检索工作: ```java // 导入必要的包 import java.util.List; import org.junit.jupiter.api.Test; import static com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper.*; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @Test void findLatestRecordsPerGroup() { List<UserActivity> latestActivities = lambdaQuery() .select(UserActivity::getId, UserActivity::getUserId, UserActivity::getTimestamp) .groupBy(UserActivity::getUserId) .having("MAX({0})", UserActivity::getTimestamp) .list(); // 打印结果集 latestActivities.forEach(System.out::println); } ``` 上述代码通过调用 `lambdaQuery()` 方法创建了一个基于 `LambdaQueryWrapper` 的链式查询构造器实例;选择了所需的字段之后应用了 `GROUP BY` 子句按照 `userId` 字段进行了分组处理;再利用 HAVING 条件筛选出各组内具有最大 `timestamp` 值的那一项[^1]。 需要注意的是,HAVING 后面的部分可能需要根据具体数据库方言调整语法结构,这里仅提供了一种常见的表达方式。对于某些复杂的场景下,建议查阅官方文档了解更详细的指导和支持的信息[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值