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  bid ORDER BY dtime DESC;

三、通过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


Logo

更多推荐