最近遇到一个需求就是需要从mysql中根据id查出一组数据,该组数据有36个类型,每种类型每天都会插入一条新的数据,然后我要拿每个类型的最新一条出来。

-- 首先我想的是,先按照类型分组,然后在按照时间去排序。

SELECT * FROM table r WHERE r.PAY_TABLE_ID='' GROUP BY r.PERIODS_NUMBER ORDER BY r.INSERT_DATE

-- 这样得出来的结果是最早更新进去的数据,并不是我要的最新的数据,这是为什么呢?我明明做了排序。

-- 上网查资料发现,是在分组之前数据库就默认得到了结果,然后我们在order by的时候就不会得到我们想要的结果。

第一种方法:根据上面的分析,我们要想得到想要的结果。

首先,使用GROUP_CONCAT函数 他可以设置分组的条件 在这里我们需要的条件就是时间最新的一条,语法如下:

-- 功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

-- 语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

-- 说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

eg: SELECT GROUP_CONCAT(r.id ORDER BY r.INSERT_DATE DESC) FROM TABLE r WHERE r.PAY_TABLE_ID='' GROUP BY r.PERIODS_NUMBER ORDER BY r.INSERT_DATE

里面的id是我只查询id,然后条件就是插入时间倒叙,得到的结果就是把分组后的id都查询出来,但是我们只需要第一条,所以我们需要用到另外一个函数,没错!

第2步:SUBSTRING_INDEX截取函数 具体语法如下:

substring_index(str,delim,count)

str:要处理的字符串

delim:分隔符

count:计数

例如:str=www.wikibt.com

substring_index(str,'.',1)

结果是:www

substring_index(str,'.',2)

结果是:www.wikibt

也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容。相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:

substring_index(str,'.',-2)

结果为:wikibt.com

本处:SELECT SUBSTRING_INDEX(GROUP_CONCAT(r.id ORDER BY r.INSERT_DATE DESC),',',1) FROM SQRZ_PAY_TABLE r WHERE r.PAY_TABLE_ID='' GROUP BY r.PERIODS_NUMBER ORDER BY r.INSERT_DATE

这样 我们就得到了根据时间倒叙,分组后最新的数据了,但是只有id显然不是我们想要的,所以,最后一步就是经常用的 in 查询 把数据全部查询出来

SELECT * from table w where w.id in (SELECT SUBSTRING_INDEX(GROUP_CONCAT(r.id ORDER BY r.INSERT_DATE DESC),',',1) FROM table r WHERE r.PAY_TABLE_ID='' GROUP BY r.PERIODS_NUMBER ORDER BY r.INSERT_DATE)

以上是网上查询所得的一种方法。

第二种方法:使用mysql DATEDIFF(date1,date2)

定义和用法:DATEDIFF() 函数返回两个日期之间的天数。

eg:SELECT * FROM table r WHERE r.id='' AND DATEDIFF(r.INSERT_DATE,DATE(NOW()))=0

两个时间相差为0,也就是当天,故此也能得到想要的最新的数据。

第三种方法,如果存入数据库的时间是"yyyy-MM-dd"格式的时间,可以使用str-to-date

mysql日期和字符相互转换方法

date_format(date,’%Y-%m-%d’) ————–>oracle中的to_char();

str_to_date('2020-01-19',’%Y-%m-%d’) ————–>oracle中的to_date();

%Y:代表4位的年份

%y:代表2为的年份

%m:代表月, 格式为(01……12)

%c:代表月, 格式为(1……12)

%d:代表月份中的天数,格式为(00……31)

%e:代表月份中的天数, 格式为(0……31)

%H:代表小时,格式为(00……23)

%k:代表 小时,格式为(0……23)

%h: 代表小时,格式为(01……12)

%I: 代表小时,格式为(01……12)

%l :代表小时,格式为(1……12)

%i: 代表分钟, 格式为(00……59) 【只有这一个代表分钟,大写的I 不代表分钟代表小时】

%r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)

%T:代表 时间,格式为24 小时(hh:mm:ss)

%S:代表 秒,格式为(00……59)

%s:代表 秒,格式为(00……59)

eg:SELECT * FROM table r WHERE r.id='' AND r.INSERT_DATE=str-to-date('2020-02-14','%Y-%m-%d')

mysql取分组最新的一条_mysql group by之后取每个分组最新的一条相关推荐

  1. mysql多个分类取n条_MySQL获取所有分类和每个分类的前N条记录

    MySQL获取所有分类和每个分类的前N条记录.比如有文章表 test(Id,type,tiem),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用. SELECT ...

  2. oracle去重保留一条_mysql、oracle 去重(数据库删除重复数据保留一条)

    现在在数据库中有2对重复数据,2条正常数据,我想要把重复数据都删掉 讲一下思路 根据重复字段分组,并增加约束条件,查询出所有的,重复数据的最小id,和重复的属性 SELECT uname,MIN(ui ...

  3. mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)

    mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)_toString的博客-CSDN博客 select * from  mt_customer_bind_info_ax ...

  4. mysql分组取日期最大的记录_mysql 分组 group by, 排序 取每条记录中,时间最大

    mysql教程 分组 group by, 排序 取每条记录中,时间最大的一条记录 select a.* from test a, (select aid, max(day) max_day from ...

  5. mysql 取第一条_MySQL索引底层(一)索引底层原理

    微信公众号:Java患者 专注Java领域技术分享 MySQL索引底层原理 局部性与页 在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB ...

  6. MySQL5.7用group by分组根据组中某个字段的最大值求取那条记录(注意是整条记录)

    首先注意,取每组最大的数据和取每组最大的一条记录是两个概念,前者很简单直接分组,max()即可.另外由于我的是5.7.24版本,5.7版本普遍存在一个问题,就是select的字段只能是group by ...

  7. mysql余额统计_实现按部门月卡余额总额分组统计的SQL查_mysql

    陈优章的专栏 (原创,到现在为至最为复杂的SQL查询代码)实现按部门月卡余额总额分组统计的SQL查询代码(在Ms SQL Server中调试通过) SELECT dp.dpname1 AS 部门, c ...

  8. mysql删除重复数据只保留一条_mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  9. mysql语句 查询前5个_MySQL 查询语句--------------进阶5:分组查询

    #进阶5:分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 [where 筛选条件] group by 分组的列表 [order by 子句] 注意: 查询 ...

最新文章

  1. php8支持哪些新特征,PHP8 新特性总结(一)
  2. 成功解决ImportError: [joblib] Attempting to do parallel computing without protecting your import on a sy
  3. Android 的全盘加密容易破解
  4. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第十三周学习总结
  5. 昇腾AI处理器软件栈--神经网络软件架构
  6. python测试驱动开发百度云_【有书共读】《Python测试驱动开发》读书笔记01
  7. df满足条件的值修改_如何用python实现熵值法求指标权重(实例)
  8. LeetCode 53.最大子序和(动态规划)
  9. 使用C++编程语言保存数据库查询结果的方法
  10. iOS逆向之利用Xcode重签名
  11. IDEA中写jsp代码没有提示
  12. [渝粤教育] 浙江工商大学 工程英语口语(王晓英) 参考 资料
  13. arcgis的lyr样式转qgis的sld样式
  14. uniapp 中使用彩色图标,引入阿里图库iconfont
  15. 小飞鱼平台介绍——小飞鱼开发者服务平台业务介绍
  16. 【科创人】快狗打车CTO沈剑:努力不会背叛,承担社会责任的企业胜算高一点点...
  17. springboot+成都大学校园植物网站 毕业设计-附源码181557
  18. c语言基础题库·第一章
  19. matlab算地形坡度,自然地形坡度分析、坡向分析的作用
  20. 基金转换——乾坤大挪移

热门文章

  1. 【python】自动登录51cto家园
  2. python打九九乘法表上三角下三角_python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数... - 小黑电脑...
  3. 谈下最近做的一个手机app,学习到的东西挺多的哦
  4. 用PS怎样把一个字体居中整个图片
  5. 斐讯n1盒子装网易音乐命令版
  6. n918st能刷Android5吗?,中兴 N918st(V5S 双4G版)获取Root权限服务含精简系统方案
  7. 【接口自动化】3.写接口自动化case要注意的点
  8. 伦敦大学国王学院计算机学院官网,伦敦大学国王学院 King’s College London
  9. PR软件——音频变音(机器音)
  10. SQL经典50查询语句(面试题)案例2