本教程今天要講述一下關於,困擾使用mysql教程數據庫教程的朋友的一個常見的問題,mysql group by 先排序與分組同時使用方法,下面看實例。
看排序
select * from (select * from posts order by dateline desc) group by tid order by dateline desc limit 10
這樣效率應該高點。取消了order by 的filesort過程。
select * from t where logtime in (select max(logtime ) from t group by username)
也有網友利用自連接實現的 ,這樣的效率應該比上面的子查詢效率高,不過,為了簡單明了,就只用這樣一種了,group by沒有排序功能,可能是mysql弱智的地方,也許是我還沒有發現
--
-- 表的結構 `test`
--
create table if not exists `test` (
`id` int(11) not null auto_increment,
`name` varchar(16) not null,
`month` int(11) not null,
`serial` int(11) not null,
`other` varchar(20) not null,
primary key (`id`)
) engine=myisam default charset=utf8;
--
-- 導出表中的數據 `test`
--
insert into `test` (`id`, `name`, `month`, `serial`, `other`) values
(1, 'a', 200807, 2, 'aaa1'),
(2, 'a', 200805, 2, 'aaa2'),
(3, 'b', 200805, 3, 'bbb3'),
(4, 'b', 200805, 4, 'bbb4'),
(5, 'a', 200805, 1, 'aaa5'),
(6, 'c', 200807, 5, 'ccc6'),
(7, 'b', 200807, 8, 'bbb7'),
(8, 'c', 200807, 3, 'ccc8'),
(9, 'a', 200805, 6, 'aaa9');
查詢
select * from (select * from test order by month desc,serial desc) t group by name
得到
id name month serial other
1 a 200807 2 aaa1
7 b 200807 8 bbb7
6 c 200807 5 ccc6
換一下排序方式
select * from (select * from test order by month asc,serial desc) t group by name
得到
id name month serial other
9 a 200805 6 aaa9
4 b 200805 4 bbb4
6 c 200807 5 ccc6
都按我們的要求顯示了結果