mysql分组后如何获取每个组的第一条数据

 更新时间:2023年08月11日 16:04:31   作者:Xu_jesse  
这篇文章主要介绍了mysql分组后如何获取每个组的第一条数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

mysql分组后获取每个组的第一条数据

已知:subject表(主题表),主题表为树形表

path字段,使用分隔符###,将主题编码从一级到本级主题编码,拼接起来,便于查询主题下子主题数据。

现在,需要根据path排序,聚合查询一级主题的名称和条数。

直接上结果:

两种写法:

一:内层distinct

select tt.name as subjectName,path,count(*) as countNum from  (select **distinct t.table_id_**, t.SUBJECT_ID_, s.name_ as name,path_,SUBSTRING_INDEX(path_,'###',1) as path from model_table t  join hdgp_standard_subject s on t.SUBJECT_ID_ = s.id_ where t.IS_DELETE_ = 0 and !isnull(t.SUBJECT_ID_) and t.VERSION_TYPE_ = 'formal' order by s.path_  ) tt group by tt.path ;

二:内层group

select tt.name as subjectName,path,count(*) as countNum from  (select t.SUBJECT_ID_, s.name_ as name,path_,SUBSTRING_INDEX(path_,'###',1) as path from model_table t  join hdgp_standard_subject s on t.SUBJECT_ID_ = s.id_ where t.IS_DELETE_ = 0 and !isnull(t.SUBJECT_ID_) and t.VERSION_TYPE_ = 'formal' **group by t.table_id_** order by s.path_  ) tt group by tt.path ;

解释一下:

直接查询是查不出想要的结果的,需要嵌套子查询。但是只嵌套只查询也是有问题的,内层循环也需要进行过滤一下,可以使用distinct或者group ,再联合order by 进行排序,才能获取想要的结果。

这样写,发现一个问题,就是如果只有子主题的话,就查不出来一级主题了,改进如下:(多关联一遍,这样子查询都省了)

SELECT
    ss.NAME_ AS subjectName,
    count(*) AS countNum
FROM
    model_table t
        JOIN hdgp_standard_subject s ON t.SUBJECT_ID_ = s.id_
        JOIN hdgp_standard_subject ss ON SUBSTRING_INDEX( s.path_, '###', 1 ) = ss.CODE_
WHERE
    t.IS_DELETE_ = 0
  AND ! isnull( t.SUBJECT_ID_ )
  AND t.VERSION_TYPE_ = 'formal'
GROUP BY
    ss.code_

mysql获取每组的第二条记录

-- rank 第n次重复, last_patient表中某一重复字段名称
SELECT
 t.id,t.patient_id,t.patient_name
FROM (
	select 
		id,patient_id,patient_name,
	  if(@last_patient = a.patient_id,@rank := @rank+1,@rank := 1) AS "rank", -- 判断 当前patient_id与@last_patient是否相等,不相等rank为1,相等时rank加1,
		@last_patient := a.patient_id
	FROM lis_data_collection a,(SELECT @rank:=0,@last_patient:="") r -- 声明两个变量@rnak及@last_patient,并初始化
	ORDER BY a.id asc
) t 
where rank= 2
ORDER BY id ASC

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mysql 相邻两行记录某列的差值方法

    Mysql 相邻两行记录某列的差值方法

    今天小编就为大家分享一篇Mysql 相邻两行记录某列的差值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • MYSQL 5.6 从库复制的部署和监控的实现

    MYSQL 5.6 从库复制的部署和监控的实现

    这篇文章主要介绍了MYSQL 5.6 从库复制的部署和监控的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • mysql datetime 默认值的设置实现

    mysql datetime 默认值的设置实现

    在MySQL中,DATETIME类型用于存储包含日期和时间部分的值,设置默认值的方式因 MySQL 版本而异,下面就来介绍一下,感兴趣的可以了解一下
    2025-08-08
  • mysql如何删除数据表和关联的数据表删除详情

    mysql如何删除数据表和关联的数据表删除详情

    这篇文章主要介绍了mysql如何删除数据表和关联的数据表删除详情,删除数据表的时候,表的定义和表中所有的数据均会被删除。因此,在进行删除操作前,最好对表中的数据做一个备份,以免造成无法挽回的后果
    2022-07-07
  • Mysql Sql 语句练习题(50道)

    Mysql Sql 语句练习题(50道)

    mysql一直作为比较热门的数据库存储,搭配php使用简直是绝配,mysql的sql语句也是很重要的一门课,这里为大家分享一下sql语句,大家可以试试
    2020-12-12
  • 彻底搞懂MySQL存储过程和函数

    彻底搞懂MySQL存储过程和函数

    我们大家都知道MySQL 存储过程是从 MySQL 5.0 开始逐渐增加新的功能,下面这篇文章主要给大家介绍了关于MySQL存储过程和函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • MySQL笔记之修改表的实现方法

    MySQL笔记之修改表的实现方法

    我们在创建表的过程中难免会考虑不周,因此后期会修改表。本篇文章就介绍了在mysql中修改表的实现方法。需要的朋友参考下
    2013-05-05
  • MySQL修改密码的四种实现方式

    MySQL修改密码的四种实现方式

    文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包括关闭MySQL服务、跳过权限表认证、修改密码、刷新权限等步骤
    2025-02-02
  • mysql中GROUP_CONCAT函数使用技巧及问题详解

    mysql中GROUP_CONCAT函数使用技巧及问题详解

    这篇文章主要给大家介绍了关于mysql中GROUP_CONCAT函数使用技巧及问题的相关资料,GROUP_CONCAT是MySQL中的一个聚合函数,它用于将多行数据按照指定的顺序连接成一个字符串并返回结果,需要的朋友可以参考下
    2023-11-11
  • Mysql备份多个数据库代码实例

    Mysql备份多个数据库代码实例

    这篇文章主要介绍了Mysql备份多个数据库代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论