`

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

 
阅读更多

 


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


代码如下:

select * from test group by category_id order by `date`


结果如下

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


引用

写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...


所以在order by拿到的结果里已经是分组的完的最后结果。
由from到where的结果如下的内容。

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


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

即使order by也只是从上面的结果里进行排序。并不是每个分类的最新信息。
回到我的目的上 --分类中最新的信息
根据上面的分析,group by到select时只取到分组里的第一条信息。有两个解决方法
1,where+group by(对小组进行排序)
2,从form返回的数据下手脚(即用子查询)

由where+group by的解决方法
对group by里的小组进行排序的函数我只查到group_concat()可以进行排序,但group_concat的

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

select group_concat(id order by `date` desc) from `test` group by category_id


再改进一下

select * from `test` where id in(select substring_index(group_concat(id order by

`date` desc),',',1) from `test` group by category_id ) order by `date` desc

 

子查询解决方案

select * from (select * from `test` order by `date` desc) `temp` group by category_id

order by `date` desc

数据表结构


create table `test` (
`id` int(10) not null auto_increment,
`name` varchar(255) not null,
`category_id` int(10) not null,
`date` timestamp not null default current_timestamp,
primary key (`id`)
)
engine=myisam
row_format=default;
insert into `test` (`id`, `name`, `category_id`, `date`)
values
(1, 'aaa', 1, '2010-06-10 19:14:37'),
(2, 'bbb', 2, '2010-06-10 19:14:55'),
(3, 'ccc', 3, '2010-06-10 19:14:02'),
(4, 'ddd', 1, '2010-06-10 19:16:15'),
(5, 'eee', 2, '2010-06-10 19:16:35');
(6, 'fff', 3, '2010-06-10 19:16:45');

 

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

 

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

分享到:
评论

相关推荐

    深度分析mysql GROUP BY 与 ORDER BY

    本文就和大家一起深入研究下mysql中group by与order by.下面是我模拟我的内容表   我现在需要取出每个分类中最新的内容 select * from test group by category_id order by `date` 结果如下   明显。这不是我想...

    深入解析mysql中order by与group by的顺序问题

    mysql 中order by 与group by的顺序是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group ...

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    Mysql利用group by分组排序

    MySQL的group by与Oracle有所不同,查询得字段可以不用写聚合函数,查询结果取得是每一组的第一行记录。 利用上面的特点,可以利用mysql实现一种独特的排序; 首先先按某个字段进行order by,然后把有顺序的表进行...

    Mysql中order by、group by、having的区别深入分析

    在MySQL数据库中,ORDER BY、GROUP BY 和 HAVING 子句是SQL查询中用于数据处理的关键组成部分,它们各自承担不同的任务,以帮助我们从数据库中提取有用的信息。 ORDER BY 子句主要用于对查询结果集进行排序。当你...

    mysql中count(), group by, order by使用详解

    在MySQL中,`COUNT()`, `GROUP BY`, 和 `ORDER BY` 是三个非常重要的SQL语句组成部分,它们各自承担着不同的职责,同时也常被结合在一起使用以满足复杂的数据查询需求。 `COUNT()` 是一个聚合函数,它用于计算指定...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    MySQL中的`ORDER BY`和`GROUP BY`是SQL查询中两个关键的子句,它们用于对查询结果进行排序和分组。然而,在某些情况下,MySQL可能会使用`Using filesort`来完成这些操作,这通常会导致性能下降。本文将深入探讨`...

    MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT

    mysql中order by与group by的区别

    order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是... 您可能感兴趣的文章:sql中 order by 和 group by的区别深度分析mysql GROUP BY 与 ORDER BYgroup by,having,o

    mysql group by用法

    - **分组后排序:**在`GROUP BY`后使用`ORDER BY`可以对分组后的结果进行排序,如`ORDER BY column1 ASC/DESC`。 **4. 注意事项** - 在`SELECT`列表中,除了聚合函数外,只能包含`GROUP BY`子句中出现的列。 - `...

    MySQL之聚合查询、分组和排序

    - `SELECT gender, COUNT(*) AS num_students FROM student GROUP BY gender HAVING num_students > 2 ORDER BY num_students DESC;` 通过上述介绍可以看出,聚合查询、分组和排序是在MySQL中处理和分析数据的强大...

    MySQL Order By索引优化方法

    MySQL的`ORDER BY`和`GROUP BY`子句在执行查询时,对于性能的影响是显著的,尤其是在大数据量的表中。为了提高查询效率,索引优化显得至关重要。本文将详细介绍如何利用索引来优化`ORDER BY`操作。 首先,MySQL在...

    MySQL优化篇:排序分组优化.pdf

    在优化order by排序时,首先应当尽量利用索引来实现排序,即使用index方式排序,避免使用FileSort方式排序。FileSort是MySQL在内存中临时排序的过程,当不能利用索引排序时,MySQL会进行文件排序,这会消耗大量的CPU...

    mysql使用GROUP BY分组实现取前N条记录的方法

    在MySQL数据库中,GROUP BY语句通常用于对数据进行分组,以便对每个分组执行聚合函数,如COUNT(), SUM(), AVG(), MAX(), MIN()等。然而,有时我们需要在分组后获取每个分组的前N条记录,这在处理统计分析或排名问题...

    MySQL高级查询之与Group By集合使用介绍

    如果想去除重复值并按特定顺序排序,可以在`GROUP_CONCAT`内部使用`DISTINCT`和`ORDER BY`,如`GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ')`。 `WITH ROLLUP`是`GROUP BY`的一个...

Global site tag (gtag.js) - Google Analytics