mysql group by排序问题

group by分组排序(组内排序) 一、项目场景: 有张调用记录表有多个客户端的调用记录,每条调用记录有当次调用记录的详细信息 分页列表需要查出 每个客户端的调用次数、以及最新一次调用的信息。 这里举个栗子来模拟一下业务,创建一张评论表,里面存了每个用户的多个评论信息。SQL如下 CREATE TABLE `user_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL, `contents` 阅读详情

类如 有一个 帖子的回复表,posts( id , tid , subject , message ,  dateline ) ,

id为 自动增长字段, tid为该回复的主题帖子的id(外键关联),  subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示,

现在要求 选出 前十个来自不同主题的最新回复


SELECT * FROM posts GROUP BY  tid  LIMIT 10



这样一个sql语句选出来的并非你想要的 最新的回复,而是最早的回复,实际上是某篇主题的第一条回复记录!

也就是说 GROUP BY 语句没有排序,那么怎么才能让 GROUP 按照 dateline 倒序排列呢?加上 order by 子句?

看下面:

SELECT * FROM posts GROUP BY  tid  ORDER BY dateline DESC LIMIT 10


这条语句选出来的结果和上面的完全一样,不过把结果倒序排列了,而选择出来的每一条记录仍然是上面的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了, 有网友会写出下面的sql 语句:


SELECT * FROM posts GROUP BY  tid DESC ORDER BY dateline DESC LIMIT 10



也就是说 在 GROUP BY 的字段 tid 后面加上递减顺序,这样不就可以取得分组时的最后回复了吗?这个语句执行结果会和上面的一模一样,这里加上 DESC 和ASC对执行结果没有任何影响!其实这是一个错误的语句,原因是GROUP BY 之前并没有排序功能,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序,因为按照tid分组,其实也就是说,把tid相等的归纳到一个组,这样想的话,GROUP BY tid DESC 可以认为是在按照 tid 分组的时候,按照tid进行倒序排列,这不扯吗,既然是按照tid分组,当然是tid相等的归到一组,而这时候按照tid倒叙还是升序有个P用!


于是有网友发明下面的语句:


SELECT * FROM posts GROUP BY  tid , dateline DESC ORDER BY dateline DESC LIMIT 10



心想这样我就可以在分组前按照  dateline 倒序排列了,其实这个语句并没有起到按照tid分组的作用,原因还是上面的,在group by 字段后加 desc 还是 asc 是错误的写法,而这种写法 网友本意是想 按照 tid 分组,并且在分组的时候按照 dateline排倒序!而实际这句相当于下面的写法:(去掉 GROUP BY 字段后面的 DESC)


SELECT * FROM posts GROUP BY  tid , dateline ORDER BY dateline DESC LIMIT 10


也就是说,按照 tid 和 dateline 联合分组,只有在记录tid和dateline 同时相等的时候才归纳到一组,这显然不可能, 因为 dateline 时间线基本上是唯一的!


有人写出下面的语句:


SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid ORDER BY dateline DESC LIMIT 10


这条语句的没错是选出了最大发布时间,但是你可以对比一下 dateline 和 max_dateline 并不相等!(可能有相当的情况,就是分组的目标记录只有一条的时候!)


为什么呢?原因很简单,这条语句相当于是 在group by 以后选出 本组的最大的 发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!

后来更有网友发明了下面的写法!


SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid HAVING dateline=max(dateline)


ORDER BY dateline DESC LIMIT 10



这条语句的预期结果和想象中的并不相同!因为你会发现,分组的结果中大量的记录没有了!为什么?因为 HAVING 是在分组的时候执行的,也就说:在分组的时候加上一个这样的条件:选择出来的 dateline 要和 本组最大的dateline 相等,执行的结果和下面的语句相同:


SELECT *,max(dateline) as max_line FROM posts GROUP BY  tid HAVING count(*)=1


ORDER BY dateline DESC LIMIT 10


看了这条sql语句是不是明白了呢?

dateline=max(dateline) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认dateline为不重复的值)


原因还是因为 group by 并没有排序功能,所有的这些排序功能只是错觉,所以你最终选出的 dateline 和max(dateline) 永远不可能相等,除非本组的记录只有一条!GROUP BY 在分组的时候,可能是一个一个来找的,发现有相等的tid,去掉,保留第一个发现的那一条记录,所以找出来的 记录永远只是按照默认索引顺序排列的!


那么说了这么多,到底有没有办法让 group by 执行前分组阿?有的 ,子查询阿!


最简单的 :


SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) AS t GROUP BY  tid LIMIT 10


原语句:SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) GROUP BY  tid ORDER BY dateline DESC LIMIT 10 (X掉)

也有网友利用自连接实现的 ,这样的效率应该比上面的子查询效率高,不过,为了简单明了,就只用这样一种了,GROUP BY没有排序功能,可能是mysql弱智的地方,也许是我还没有发现,

期待高人拍砖!

修正几点评论的疑问:

1.自查询确实需要起个table名字,写时候漏掉了,因为每一条sql语句都是我测试过,才发出来,不会有不能运行的情况。

2.有人说,第二个order by 是多余的,因为从自查询里找出来的已经排好了序,所以后面的不必再排序,去掉了。

面试题集锦 一.Hadoop 1.hdfs写流程 2.hdfs读流程 3.hdfs的体系结构 4.一个datanode 宕机,怎么一个流程恢复 5.hadoop 的 namenode 宕机,怎么解决 6.namenode对元数据的管理 7.元数据的checkpoint 8.yarn资源调度流程 9.hadoop中combiner和partition的作用 10.用mapreduce怎么处理数据倾斜问题? 11.shuffle 阶段,你怎么理解的 12.Mapreduce 的 map 数量 和 . 阅读详情

相关推荐

LabVIEW新手必看:5个工业自动化实战项目从零搭建(附完整代码)

本文为LabVIEW新手提供了5个从零开始的工业自动化实战项目指南,涵盖数据采集、状态机控制、PID闭环、振动监测及多站协同监控。通过详细的架构解析和关键代码片段,帮助读者快速掌握LabVIEW图形化编程的核心逻辑与工程化思维,并附完整代码实现。

agile9scrum的博客 1073

如何使用 SQL GROUP BY 分组和排序数据

文章目录一、数据分组二、创建分组三、过滤分组四、分组和排序五、SELECT 子句顺序六、小结 本文介绍如何使用 SQL GROUP BY 子句分组数据,以便汇总表内容的子集。这涉及两个新 SELECT 语句子句:GROUP BY 子句和 HAVING 子句。 一、数据分组 从 如何使用 SQL AVG、COUNT、MAX、MIN 和 SUM 汇总数据 中得知,使用 SQL 聚集函数可以汇总数据。这样,我们就能够对行进行计数,计算和与平均数,不检索所有数据就获得最大值和最小值。 目前为止的所有计算都是在表的所

Vin_c° 的专栏 1万+

(一)PyBullet机器人仿真入门:从环境搭建到实例解析

本文详细介绍了PyBullet机器人仿真平台从零开始的完整入门指南。内容涵盖环境搭建、官方示例解析、核心操作(连接、世界与模型)、关节控制与状态读取,以及碰撞检测、传感器模拟等高级功能,帮助读者快速掌握这一强大的机器人仿真工具。

weixin_29062865的博客 1382

group by内部排序

规则: 第一,凡是在group by后面出现的字段,必须同时在select后面出现; 第二,凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面. 第一和第二条规则任何一条不满足,则默认去分组的第一条记录显示 having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。 重点内容 如果想对于group by内部进行排序,例如下面这

青色橙子 2万+

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置)

本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。

weixin_29213827的博客 539

【通信原理 入坑之路】—— 详解IQ调制以及星座图原理

文章目录一. IQ调制与解调的原理与过程二.PSK(相移键控)和IQ调制的关系:2.1 用IQ调制实现QPSK调制 一. IQ调制与解调的原理与过程 IQ调制的定义是:“IQ调制就是数据分为两路,分别进行载波调制,两路载波相互正交。I是in-phase(同相), q是 quadrature(正交)” 我们通过下面的示意图介绍IQ调制的过程: 首先,信号分成两路:I路和Q路(为了方便理解我们把这两...

凝望,划过星空的博客 11万+

group by分组查询后排序

group by分组查询后排序 如:分组查询 SELECT s.name name,COUNT(s.id) value FROM t_setmeal s,t_order o WHERE s.id=o.setmeal_id GROUP BY s.name 现在想实现 分组查询后,按照value值由高到低排序。 实现:通过子查询分组查询出一个派生表,再对该表排序查询 1、上面查询出来的就是一个新的表,一个属性为 name, value 的表。(注意:每个派生表都必须有自己的别名 ) 2、以上面的表为基础

大帅哥的博客 6916

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 335

mysql中group by的排序问题_【Mysql】group by中的排序问题

/** * Author:RDP * My mail:abel1314520@gmail.com * My blog:http://blog.teamhaka.com*/比如有这样的一个表结构:id v110 111 120 18 17 1当你使用SELECT COUNT(*),id FROM tbl GROUP BY v1来进行搜索的时候,得到的结果只有一行。其id...

weixin_36072221的博客 3696

风力发电机并网模型建立及仿真验证

传统能源日益匮乏,环境污染日趋严重,全球向安全、可靠和环保的可持续能源体系转型迫在眉睫,风电迎来了重要的发展契机。近年来,全球风电迅猛发展,我国已成为世界风电新增装机容量第一的国家。然而,随着风电规模的不断增大,风电场接入对系统影响不容忽视。随着变速恒频风力发电系统优越的性能突出和大容量电力电子技术的成熟,风速随机性引起的功率波动及故障情况下的动态响应,对电能质量,系统电压、频率的稳定性产生的影响需要深入研究。因而,本文结合实际项目,针对变速恒频风力发电系统建模,端口动态特性及对电网电能质量、运行稳定性的影

毕业设计区博客 1641

HFSS15 win10_64位破解

HFSS15 win10_64位破解 找到的别人的软件,但在首次安装时失败了,并不能patched。寻找了几种方法,已成功安装。在此写下安装经验,供大家参考。 软件安装包以及破解软件: 链接:https://pan.baidu.com/s/1MMjV_31maU5QD6fmI4zfIA 提取码:yj4q 在安装之前,建议关闭杀毒软件。 Step1:进入HFSS150Win64安装包,点击au...

玉笙寒 4万+

mysql group by 顺序_mysql group by 排序的问题

最近在项目中遇到了一个需要先排序,再group by的问题。上表CREATE TABLE `test` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`install` int(10) unsigned NOT NULL,`day` int(10) unsigned NOT NULL,`aid` int(10) unsigned NOT NULL,P...

weixin_33816685的博客 858

YOLOv11改进 | 网络结构代码逐行解析(二) | yolov11中的Mosaic增强详解

本文给大家带来的是YOLOv10中的Mosaic增强代码的详解,可能有部分人对于这一部分比较陌生,有的读者可能知道Mosaic增强但是不知道其工作原理,具体来说Mosaic增强就是指我们的数据集中的图片在输入给模型之前的一个处理过程(我们的图片并不是直接就输入给模型了,大家的训练结果中的结果检测图片大家可以看到数据集中多个图片会组合在一起这就是简单的Mosaic增强),下面我就来讲解一下其在YOLOv10中工作原理和代码定义,下面图片为一个Mosaic增强后的图片。​。

Snu77的博客 5023

常见mysql中group by 与 order by 一起使用排序问题

常见mysql中group by 与 order by 一起使用排序问题group by排序方法一:先排序,在分组,使用子查询方法二:如果不需要取得整条记录,则可以使用 max() group by排序 假设有一个表:qipa_reward(奖励表),表结构如下: CREATE TABLE `qipa_reward` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL COMMENT '用户uid', `money` de

徊忆羽菲 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Mysql升级到5.7后遇到的group by查询问题及order by排序问题解决

最近在将mysql升级到mysql 5.7后,进行一些group by 查询时,比如下面的 SELECT *, count(id) as count FROM `news` GROUP BY `group_id` ORDER BY `inputtime` DESC LIMIT 20 就会报如下错误: SELECT list is not in GROUP BY clause and co...

非著名程序员 1837

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mysql group语句可以排序_Mysql group by 排序问题

类如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) , id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示, 现在要求 选出 前类如 有一个 帖子的回复表,posts( id , tid , ...

weixin_35455994的博客 407

mysql :group by 与order by 共同使用时排序问题,小心utf8的排序

mysql :group by 与order by 共同使用时排序问题,小心utf8的排序

cq546389274的博客 1585

mysql group by 排序的问题

最近在项目中遇到了一个需要先排序,再group by的问题。 上表 CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `install` int(10) unsigned NOT NULL, `day` int(10) unsigned NOT NULL, `aid` int(10) un...

LHB850128的博客 90

Mysql group by 排序问题

Mysql group by 排序问题 类如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) , id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNI...

weixin_30505043的博客 117

Mysql group by中子查询order by排序失效问题分析

sql 1): select id,goods_id,create_time,price from mkt_price_control where 1=1 and price_id = 1 and goods_id = 598915619202568300 ORDER BY create_time desc 结果集 1): sql 2): 当我们对上面的语句进行分组时, 出现了原先倒序排序失效的问题 select mpc1.* from ( s...

她们都叫我靓仔 3675

MYSQL数据库联合使用GROUP BY和ORDER BY后ORDER BY排序失效的问题

MYSQL数据库联合使用GROUP BY和ORDER BY后ORDER BY排序失效的问题 当我们需要使用group by 和order by来筛选排序的时候基本的语句如下 select * from a group by id order by create_date; 但是这样查询出来的结果是不正确的,order by排序失效了。 原因 由于sql语句执行的时候是先group by分组之后再进行order by排序,这就说明分组的时候取到的数据可能不是最大时间的数据,然后我们再去排序得出来的结果就不准确

zhuzhonghua02的博客 4455

mysql group by 倒序_Mysql group by 排序问题

类如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) , id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示, 现在要求 选出 前类如 有一个 帖子的回复表,posts( id , tid , ...

weixin_28836989的博客 431

MySQL中group by 与 order by 一起使用排序问题

假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id int(11) NOT NULL AUTO_INCREMENT, uid int(11) NOT NULL COMMENT '用户uid', money decimal(10, 2) NOT NULL COMMENT '奖励金额', datatime dat...

幽篁晓筑的博客 3万+

mysql group by 倒序_mysql group by排序问题

类如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) ,id为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示,现在要求 选出 前十个来自不同主题的最新回复SELECT * FROM posts ...

weixin_42461108的博客 2904

mysql先分组后排序语法_mysql查询中oder by 和group by 的问题【要先分组再排序】

做网上的mysql语句练习题,题目如下,-- 13、查询和"01"号的同学学习的课程完全相同的其他同学的信息我写的mysql语句如下,SELECT student.`*` FROM studentLEFT JOIN score ON student.s_id = score.s_idORDER BY score.c_idWHERE student.s_id <> '01'GROUP B...

weixin_28684757的博客 296
上一篇: PHP存取 Mysql 数据乱码终极解决方案
下一篇: 抛弃prototype了
AllinJS
博客等级 码龄19年 16粉丝 11原创
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值