MySQL 数据分组后取第一条数据

mysql,数据,分组,第一条 · 浏览次数 : 143

小编点评

**SQL 分组后取第一条数据——PARTITION BY 和 DISTINCT** 为了获取分组后数据的第一条数据,可以使用以下 SQL 语句: ```sql SELECT id,title,description,poster_id,poster_time,drug_id FROM ( SELECT DISTINCT(a.id) tid, a.* FROM cms_article_info a WHERE a.drug_id IN ('3647ae61-7d60-4af3-9a75-20e1ba73b5a6','29a13037-28d0-4f7d-8b73-1ce2833153dc') ORDER BY a.poster_time DESC ) ttGROUP BY tt.drug_id ``` **说明:** * `DISTINCT(a.id)` 在 `SELECT` 语句中用于提取结果集中的唯一的 ID。 * `ORDER BY a.poster_time DESC` 用于按照降序排列结果集中的 `poster_time` 字段。 * `GROUP BY tt.drug_id` 用于根据 `drug_id` 进行分组。 * `tt` 是一个临时表名,它首先使用 `SELECT DISTINCT(a.id)` 从 `cms_article_info` 表中提取唯一的 ID,然后通过 `ORDER BY a.poster_time DESC` 排序结果。 **注意:** * `DISTINCT` 在 `SELECT` 语句中使用后,结果将只包含每个 `drug_id` 最近一条记录。 * `ORDER BY a.poster_time DESC` 将确保结果按降序排列。

正文

SQL SERVER数据分组后取第一条数据——PARTITION BY

-- 不加 distinct(a.id)  order by 会有问题 导致获取出来的数据不对
SELECT id,title,description,poster_id,poster_time,drug_id
FROM (
 SELECT DISTINCT(a.id) tid, a.* FROM cms_article_info a
 WHERE a.drug_id IN ('3647ae61-7d60-4af3-9a75-20e1ba73b5a6','29a13037-28d0-4f7d-8b73-1ce2833153dc')
 ORDER BY a.poster_time DESC
) tt
GROUP BY tt.drug_id

原理分析:

我们这里使用了临时表排序,继而对其结果进行分组,结果显示失败,加了distinct(a.id) tid, 后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:

  • 外部查询禁止分组或者聚合
  • 外部查询未指定having,HAVING, order by
  • 外部查询将派生表或者视图作为from句中唯一指定源
  • 不满足这三个条件,order by会被忽略。

一旦外部表使用了group by,那么临时表(派生表 derived table)将不会执行filesort操作(即order by 会被忽略),所以我在临时表中加了(distinct(a.id))。
加了之后就相当于关闭了该特性,所以也就生效了。

————————————————
版权声明:本文为CSDN博主「山鬼谣me」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013066244/article/details/116461584

与MySQL 数据分组后取第一条数据相似的内容:

MySQL 数据分组后取第一条数据

SQL SERVER数据分组后取第一条数据——PARTITION BY -- 不加 distinct(a.id) order by 会有问题 导致获取出来的数据不对 SELECT id,title,description,poster_id,poster_time,drug_id FROM ( SE

MySQL基础4-数据查询

一、DQL介绍 DQL全称:Data Query Language(数据查询语言),用来查询数据库中表的记录。 关键字:select 二、DQL语法 select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序

MySQL 分表查询

分表是一种数据库分割技术,用于将大表拆分成多个小表,以提高数据库的性能和可管理性。在MySQL中,可以使用多种方法进行分表,例如基于范围、哈希或列表等。下面将详细介绍MySQL如何分表以及分表后如何进行数据查询。 基于哈希的分表 基于哈希的分表是一种将数据分散到多个子表中的数据库分表策略。这种方法通

数据库实践丨使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题

摘要:用户使用Mogdb 2.0.1版本进行业务上线测试,发现在插入数据时,应用日志中提示primary key冲突,用户自查业务SQL没有问题,接到通知后,招手处理故障。 本文分享自华为云社区《使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题》,作者:Gauss松鼠会。 故障背景 用户

[转帖]最全MySQL锁讲解:页锁、共享锁、行锁、表锁、悲观锁、乐观锁

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。 今天就分享下MySQL相关的最全锁,希望你学习后能更

MySQL的index merge(索引合并)导致数据库死锁分析与解决方案

在DBS-集群列表-更多-连接查询-死锁中,看到9月22日有数据库死锁日志,后排查发现是因为mysql的优化-index merge(索引合并)导致数据库死锁。

10分钟搞定Mysql主从部署配置

流程 Master数据库安装 Slave数据库安装 配置Master数据库 配置Slave数据库 网络信息 Master数据库IP:192.168.198.133 Slave数据库IP:192.168.198.132 配置Master数据库 在Master数据库安装完毕后,修改/etc/my.cnf

MySQL高级2-SQL性能分析

一、SQL执行频率 MySQL客户端 连接成功后,通过show [session | global] status 命令可以提供服务器状态信息,通过如下指令,可以查看当前数据库的insert,update,dalete,select的访问频次 show [global | session] stat

云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定

摘要:云数据库RDS for MySQL支持参数模板的导入和导出功能。 本文分享自华为云社区《【云小课】【第56课】RDS for MySQL参数模板一键导入导出,参数配置轻松搞定》,作者:数据库的小云妹。 云数据库RDS for MySQL支持参数模板的导入和导出功能。 导入参数模板:导入后会生成

[转帖]21个MySQL表设计的经验准则

https://juejin.cn/post/7147135702604447758 前言 大家好,我是捡田螺的小男孩。 作为后端开发,我们经常需要设计数据库表。整理了21个设计MySQL表的经验准则,分享给大家,大家看完一定会有帮助的。 公众号:捡田螺的小男孩 1.命名规范 数据库表名、字段名、索