Mysql group by 与order by 排序问题 (转)

取出每个分类中最新的内容

代码如下:

select*fromtestgroupbycategory_idorderby`date`

结果如下

明显。这不是我想要的数据,原因是msyql已经的执行顺序是

引用

写的顺序:select...from...where....groupby...having...orderby..

执行顺序:from...where...groupby...having....select...orderby...

所以在orderby拿到的结果里已经是分组的完的最后结果。

由from到where的结果如下的内容。

到groupby时就得到了根据category_id分出来的多个小组

到了select的时候,只从上面的每个组里取第一条信息结果会如下

即使orderby也只是从上面的结果里进行排序。并不是每个分类的最新信息。

回到我的目的上--分类中最新的信息

根据上面的分析,groupby到select时只取到分组里的第一条信息。有两个解决方法

1,where+groupby(对小组进行排序)

2,从form返回的数据下手脚(即用子查询)

由where+groupby的解决方法

对groupby里的小组进行排序的函数我只查到group_concat()可以进行排序,但group_concat的

作用是将小组里的字段里的值进行串联起来。

selectgroup_concat(idorderby`date`desc)from`test`groupbycategory_id

再改进一下

select*from`test`whereidin(selectsubstring_index(group_concat(idorderby

`date`desc),',',1)from`test`groupbycategory_id)orderby`date`desc

子查询解决方案

select*from(select*from`test`orderby`date`desc)`temp`groupbycategory_id

orderby`date`desc

数据表结构

createtable`test`(

`id`int(10)notnullauto_increment,

`name`varchar(255)notnull,

`category_id`int(10)notnull,

`date`timestampnotnulldefaultcurrent_timestamp,

primarykey(`id`)

)

engine=myisam

row_format=default;

insertinto`test`(`id`,`name`,`category_id`,`date`)

values

(1,'aaa',1,'2010-06-1019:14:37'),

(2,'bbb',2,'2010-06-1019:14:55'),

(3,'ccc',3,'2010-06-1019:14:02'),

(4,'ddd',1,'2010-06-1019:16:15'),

(5,'eee',2,'2010-06-1019:16:35');

(6, 'fff', 3, '2010-06-10 19:16:45');

讨论:选出论坛 前十个来自不同主题的最新回复,又该如何写呢?待续...

来源:http://www.111cn.net/database/mysql/33544.htm

相关推荐