mysql的gruopby分组功能没有排序功能,所以我们如果想取出某个分组下的最新记录是不太容易的,下面介绍两种方法,一种是通过子查询,一种是通过group_concat函数来实现。
一、表结构及数据插入
#表的结构 `test3`
CREATE TABLE IF NOT EXISTS `test3` (
`id` int(11) NOT NULL auto_increment,
`bid` int(11) NOT NULL,
`cid` int(11) NOT NULL,
`dtime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
#转存表中的数据 `test3`
INSERT INTO `test3` (`id`, `bid`, `cid`, `dtime`) VALUES
(1, 1, 3, ’2014-03-18 16:00:00′),
(2, 1, 10, ’2014-03-18 17:00:00′),
(3, 2, 5, ’2014-03-18 18:00:00′),
(4, 2, 6, ’2014-03-18 19:00:00′),
(5, 1, 7, ’2014-03-18 20:00:00′);
二、通过子查询实现
1、sql语句
select * from(select * from test3 ORDER BY dtime DESC) as tempGROUP BY
三、通过group_concat函数
1、完整的语法
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator'分隔符'])
作用:将要连接的字段按照排序字段的顺序用分隔符连起来显示,默认分隔符是”,”。
2、sql语句
select substring_index(group_concat(id order by `dtime`desc),’,',1) as id, substring_index(group_concat(bid order by`dtime` desc),’,',1) as bid,substring_index(group_concat(cid orderby `dtime` desc),’,',1) as cid,substring_index(group_concat(dtimeorder by `dtime` desc),’,',1) as dtime from `test3` group bybid;
两上结果是一致的,虽然mysql自身的group by没有排序功能,但是通过自已的思考还是有办法的,写此作为备忘吧。
select * from (SELECT * FROM jcacard.v_inoroutrecord order by RecordDateTime desc) as temp
group by EmployName
having InOrOut = 1
order by RecordDateTime