CREATE TABLE `t_iov_help_feedback` (
`ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`USER_ID` INT(255) DEFAULT NULL COMMENT '用户ID',
`problems` VARCHAR(255) DEFAULT NULL COMMENT '问题描述',
`last_updated_date` DATETIME DEFAULT NULL COMMENT '最后更新时间',
PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。
我们使用下列 SQL 语句:
SELECT ID,USER_ID,problems,last_updated_date
FROM t_iov_help_feedback
GROUP BY USER_ID;
结果集类似这样:
可以看到上面的,结果的确是根据 USER_ID 进行分组了,但是返回的记录是 USER_ID 对应的每组 中最小的那条记录。也就是ID最小的那条。
现在我想分组后得到,last_updated_date 最大的那条记录。这怎么实现呢?
很简单,直接查询的表默认是以 ID 进行顺序排序的,因为分组的时候取的是每组中的第一条。所以只需要 使查询的表 按照 last_updated_date 倒叙排序就行了。
实现的SQL如下,这里使用了嵌套查询。
SELECT ID,USER_ID,problems,last_updated_date
FROM (select * from t_iov_help_feedback order by USER_ID, LAST_UPDATED_DATE DESC) b
GROUP BY b.USER_ID;
其中:select * from t_iov_help_feedback order by USER_ID, LAST_UPDATED_DATE DESC 就相当于一个按照USER_ID升序, last_updated_date倒叙排序的表了。
查询结果如下:
现在取的就是每组中时间最大的那条记录了。
当遇到两个不同的表时,可以使用以下SQL:
select a.title, t.name, t.price from a
inner join (select * from b order by id, price ) t on t.id = a.b_id
group by a.b_id;
由于评论区讨论比较激烈,所以2021年我追加了下面的内容~
上述方案是基于mysql 版本5.5.40实现的,在高版本的mysql不一定可以
。
1、语法问题
SELECT ID,USER_ID,problems,last_updated_date FROM table_X GROUP BY b.USER_ID; 这样的语句在mysql 5.7 版本及以上是不通过的,
报错如下:
这是因为mysql 版本高于5.7.5时,默认设置的 sql_mode 模式是:only_full_group_by。这种情况怎么解决见我的另外篇文章:
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决
2、效果问题
高版本的mysql,就算跳过了语法检查,执行的效果还是没有的,没有得到时间最新的那条数据。
在8.0.16的mysql版本中举个例子:
表中所有数据如下
INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (1, 1, '时间比较小', '2021-02-23 10:11:49');
INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (2, 2, '时间小', '2021-02-23 10:12:49');
INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (3, 3, '我乱写的', '2021-02-23 11:19:19');
INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (4, 1, '时间比较大', '2021-02-23 11:16:01');
INSERT INTO `t_iov_help_feedback`(`ID`, `USER_ID`, `problems`, `last_updated_date`) VALUES (5, 2, '时间大', '2021-02-23 11:19:13');
可以看到,USER_ID为1和2都有重复数据。
USER_ID为1 时间最大的条记录为 2021-02-23 11:16:01,USER_ID为2 时间最大的条记录为 2021-02-23 11:19:13。
执行上述语句结果为:
对于UER_ID重复数据,可以看到,分组后没有得到时间较大的那一条记录。
这时,怎么办呢?请见我的另外一篇文章:
sql中如何取重复的数据中时间最近的一条
在MySql中 做分组时想取出每一组最新的时间那一条,但是做了分组后发现每组取的时间不是最新的,也是进行了下述操作
一.先进行排序在进行分组
执行sql
select * from (select pihao,spbh,cgl,dj,created,provider_id
from merchant_ysb_cginfo ORDER BY created desc) a GROUP BY spbh,provider_id
这里我先把数据进行了分组
得到的效果如下
我与实际数据做对比发现并不能实现想要
在查询数据时,需要分组后取每组中的最新一条数据(即时间最大的那条),示例如下
复制如下 sql 语句建表,添加数据
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_company
-- ----------------------------
DROP TABLE IF EXISTS `t_company`;
CREATE TABLE `t_company` (
`id` int(1
Mysql取分组后的每组第一条数据
gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一条数据取出。
我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组操作 。 因为在mysql分组是将第一个出现的数据进行展示出。
MySQL会创建临时表的几种情况:
1、UNION查询;
2、用到TEMPTABLE算法或者是UNION查询中的视图;
3、ORDER BY和GROUP BY的子句不一样时;
4、表连接中,ORDER BY的列不是驱动表中的;(指定了联接条件时,满足查询条件的记录行数少的表为[驱动表],未指定联接
SQL按类型分组,取日期最大的一条数据
select a.id,a.ORGANIZATION,a.CREATE_TIME,n from
(select id,ORGANIZATION,CREATE_TIME,row_number() over(partition by ORGANIZATION order by CREATE_TIME desc) as n
from t_pln_annual_target_header) a
where n<=1
row_number() over(parti
WHERE
id IN (
SELECT SUBSTRING_INDEX(group_concat( id ORDER BY `storage_time` DESC ), ',', 1 )
select * from (select * from attachments order by workorderid,LastUpdated desc) t group by workorderid;
写这篇博文是为了帮助遇到同样问题的人,希望对你有用~问题:求怎么查出同一课程id中时间最大的记录?(如下图所示)1、刚开始想通过group by 分组课程id, 然后获取最大值,如下:SELECT MAX(l.learn_time)
FROM learn l
where l.user_id = '14201109'
GROUP BY l.course_id查出来结果如下:但是我想要查出来所有的字...