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

 更新时间:2010年06月21日 12:31:07   作者:  
这两天让一个数据查询难了。主要是对group 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


 

相关文章

  • Navicat中修改MySQL的编码格式

    Navicat中修改MySQL的编码格式

    打开 Navicat for MySQL 并连接到您的数据库服务器,在左侧的连接列表中,展开数据库,然后展开要更改字符集的表,选中要更改字符集的表,右键点击并选择 "设计表",在 "设计表" 窗口中,您将看到表的列表
    2023-10-10
  • sql中left join的效率分析与提高效率方法

    sql中left join的效率分析与提高效率方法

    网站随着数据量与访问量越来越大,访问的速度变的越来越慢,于是开始想办法解决优化速度慢的原因,下面是对程序中一条sql的分析与提高效率的过程
    2018-03-03
  • 数据分析之ELT的基本概念

    数据分析之ELT的基本概念

    这篇文章主要介绍了数据分析之ELT的基本概念, ETL是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程,需要的朋友可以参考下
    2023-07-07
  • 数据库基本概念面试必问

    数据库基本概念面试必问

    这篇文章主要介绍了数据库基本概念面试必问的相关资料,需要的朋友可以参考下
    2016-03-03
  • 如何判断a、b、c三个字段同时为0则不显示这条数据

    如何判断a、b、c三个字段同时为0则不显示这条数据

    有时候我们需要判断当a、b、c三个字段同时为0则不显示,下面这个方法不错,需要的朋友可以参考下
    2013-08-08
  • 分布式数据存储系统的三要素

    分布式数据存储系统的三要素

    大家好,本篇文章主要讲的是分布式数据存储系统的三要素,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • ACCESS转SQLSERVER数据库的注意事项

    ACCESS转SQLSERVER数据库的注意事项

    Access承重量太低,当你考虑升级到SQL Server时,并不只是个连接字符串需要改变,需要改变的还有很多
    2007-01-01
  • Spark SQL操作JSON字段的小技巧

    Spark SQL操作JSON字段的小技巧

    这篇文章主要给大家介绍了关于Spark SQL操作JSON字段的小技巧,文中通过示例代码介绍的非常详细,对大家学习或者使用spark sql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Navicat Premium 15 linux 安装与激活 ArchLinux 2022最新教程(完整激活版)

    Navicat Premium 15 linux 安装与激活 ArchLinux 2022最新教程(完整激活

    navicat premium mac是一款强大数据库管理软件,通过navicat premium 15 用户快速轻松地构建,管理和维护您的数据库,结合了其他Navicat软件使用更有意想不到的功能,这篇文章主要介绍了Navicat Premium 15 linux 安装与激活 ArchLinux 2022,需要的朋友可以参考下
    2023-01-01
  • navicat导入CSV文件详细操作步骤

    navicat导入CSV文件详细操作步骤

    通过Navicat我们可以很方便的完成备份和还原操作,下面这篇文章主要给大家介绍了关于navicat导入CSV文件的详细操作步骤,需要的朋友可以参考下
    2023-12-12

最新评论