mysql "group by"与"order by"的研究--分类中最新的内容

作者:无名 - 数据库其它 -
这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况
这种需求,我想很多人都遇到过。下面是我模拟我的内容表

代码如下:


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', 1, '2010-06-10 19:16:02'),
(4, 'ddd', 1, '2010-06-10 19:16:15'),
(5, 'eee', 2, '2010-06-10 19:16:35');



我现在需要取出每个分类中最新的内容

代码如下:


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


 

IT人知识库 原文地址:http://www.itpeo.net/12848/401258.html





sql 左连接和右连接的使用技巧(left join and right join)

下面给一个例子进行说明: 例表a aid adate 1 a1 2 a2 3 a3 表b bid bdate 1 b1 ... ...

rfedfre

虚拟主机ACCESS转换成MSSQL完全攻略(图文教程)

许多用ASP开发的系统也可以支持MS SQL数据库。但有不少网友不知道如何将原来的ACCESS数据库转换成MS SQL数... ...

比较SQL Server与Oracle、DB2数据库的一些知识

开放性 SQL Server 只能在Windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。... ...

SQL数据库与oracle数据库镜像有什么不同对比

Oracle数据库与MSSQL数据操作上有很大的不同,但是,在镜像操作方面有类比的地方。这篇文章关于MSSQL数据库镜像... ...

rfedfre

MSSQL转MYSQL的一些记录

1.用MSSQL企业管理器,打开表的结构(设计表),本地用phpmyadmin根据结构一个一个创建,同时优化了一下表数据... ...

数据库修改多对多的中间表的记录的技巧

一、把中间表相应的字段先删除,然后再添加 *当单方表是从数据库中查得持久化对象必须把此对象的set容器用clear()清... ...

JDBC大批量写入数据到SQLServer2000,记录数大于10000

代码如下:SpObserver.putSp("sessionFactory1"); SimpleDateFormat ... ...

几种常用DB驱动和DB连接串小结

(一) MySQL: (1) JDBC驱动jar包:(http://www.mysql.com) mm.mysql-2.... ...

Access和SQL Server里面的SQL语句的不同之处

我的感觉是,Accees数据库虽然可以称得上是小型的关系型数据库,并且也是使用的结构化查询语言SQL,但它的语法(主要体... ...

收缩数据库不变小的解决方法

收缩前执行: 代码如下:alter database databasename set recovery simple... ...

rfedfre

MSSQL转MySQL数据库的实际操作记录

以下的文章主要介绍的是MSSQL转MySQL数据库的一些记录的实际操作流程,以及在其实际操作中发现的问题的阐述,其中包括... ...

程序员应该知道的数据库设计的两个误区

然而,在我所经历过的项目中,某些数据库的设计会存在一些问题,尤其普遍的就是下面将要描述的这两点,个人觉得是应该避免的误区... ...

大数据量,海量数据处理方法总结

下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也... ...

MDAC2.8 安装问题与解决方法

1、MDAC2.8安装问 题 在windows xp + sp2 环境下安装过程中出现提示:“mdac 2.8 Rtm ... ...

SQLServer 2005 和Oracle 语法的一点差异小结

1.获取系统当前时间 SQL Server 2005: select getdate() Oracle: select ... ...

数据库设计规范化的五个要求 推荐收藏

若符合这两个条件,则可以说明这个数据库的规范化水平还是比较高的。当然这是两个泛泛而谈的指标。为了达到数据库设计规范化的要... ...

rfedfre

数据库为何要建立索引的原因说明

这里想把之前的索引学习笔记总结一下:     首先明白为什么索引会增加速度,D... ...

数据库测试 实用技巧及测试方法

同样的在金融、租凭、零售、邮寄、医疗领域中,数据库也是不可缺少的。 随着应用的复杂程度增加需要更强大和安全系数高的数据... ...

rfedfre

未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序错误的解决方法

最近在做一个导入Excel数据到数据库的程序出现了如下错误: 运行环境 数据库:SqlServer2008 R2 ... ...

分享三种高效率SQL语句分页方法

1.如果有一个自动增长的id字段,则: 定义二个变量:Page,PageCount Select top PageCou... ...