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