当前位置:首页 > 数据库 > MySQL使用GROUP BY分组时如何留下指定的行

MySQL使用GROUP BY分组时如何留下指定的行

2022年11月06日 16:56:48数据库12

前言

假设有一个存储文章信息的数据表(article),结构如下:

字段名 说明
id 主键ID
author_id 作者ID
title 文章标题
content 文章内容
add_time 文章添加时间
edit_time 文章上一次编辑时间

作者和文章是一对多的关系,现在需要从这个表里查出每个作者最近编辑过的一篇文章,那么可以怎么写SQL语句呢?

分析

这个查询有两个条件:

  1. 每个作者仅需展示一篇文章
  2. 展示的文章是最新编辑过的那一篇

针对第一个条件,可以使用GROUP BY来实现,但第二个条件就有点棘手了,因为MySQL在分组的时候,具体留下哪一条数据是无法指定的,网上有一些方法是用INNER JOIN来处理,示例:

SELECT a.* FROM article a
INNER JOIN (SELECT MAX(edit_time) FROM article GROUP BY author_id) AS b 
ON b.edit_time = a.edit_time

不用JOIN的另一种写法:

SELECT * FROM article WHERE edit_time IN (
    SELECT MAX(edit_time) FROM article GROUP BY author_id
)

如果edit_time字段跟文章是一对一关系的话,这种方法是可行的,但在我们这个场景里,明显不是一对一关系,因此这种方法不能使用。

解决方法

既然GROUP BY无法指定留下哪一条数据,那么就干脆不用GROUP BY,用子查询来处理就好,语句如下:

SELECT * FROM article a
WHERE id = (SELECT id FROM article WHERE author_id=a.author_id ORDER BY edit_time DESC LIMIT 1)

使用EXPLAIN分析这语句的执行计划,会发现使用到独立子查询(DEPENDENT SUBQUERY),表数据量大的时候会有性能问题,因此不能用在线上业务,平时导数据偶尔使用一下还是没问题的。

作者:自由de单车
来源链接:https://blog.csdn.net/ljfrocky/article/details/111588513

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68170.html

标签: group byMySQL
分享给朋友:

“MySQL使用GROUP BY分组时如何留下指定的行” 的相关文章

MySQL表的增删改查(进阶)

MySQL表的增删改查(进阶)

数据库的约束 约束类型 NOT NULL UNIQUE DEFAULT PRIMARY...

MySQL数据库(基础)

MySQL数据库(基础)

目录 1. 数据库概念 1.1 数据库是干嘛的? 1.2 数据库和数据结构是啥关系? ​1.3 两种类型的数据库 2. MySQL数据库 2.1 MySQL数据库概念 2.2 MySQL基本操作  2.2.1 建立...

Linux安装MySQL(超详细)

Linux安装MySQL(超详细)

1 查看是否已经安装 Mysql rpm -qa | grep mysql 我之前装过一次! 如果你查看出来有东西,可以使用下面命令将其删除 rpm -e 文件名   2 下载官方 Mysq...

JDBC连接时所犯错误1.字符集设置不合适2.连接MySQL8.0社区版时时区不一致3..包名不能以Java.命名4.驱动被弃用

Microsoft JDBC Driver 的主页为:https://msdn.microsoft.com/en-us/data/aa937724.aspx 下载所需驱动 今天连接时报了四次错,记录下来 1.java.sql.SQLException:...

性能优化|深入理解mysql索引数据结构与算法

性能优化|深入理解mysql索引数据结构与算法

什么是索引? 在mysql中,索引就是帮助mysql快速找到某条数据的一种数据结构,它是排好序的,独立于mysql表数据之外的。 索引数据结构分为哪几种 二叉树、红黑树、Hash表、B树。 在这里我们主要介绍hash表和B树...

MYSQL查询某字段为空的数据

where  XXX is NULL!! 没错就是这样     拓展:查询某字段不为空的数据 where  XXX != '' 作者:Idiot_2018 来源链接:https://...

MySQL查询表中重复字段和重复的次数

查询user表中,user_name字段值重复的数据及重复次数 select user_name,count(*) as count from user group by user_name having count>1;...

mysql 查询某字段最小的记录

根据我所遇到的应用情况,总结了以下3中简单的语句 1. select *,(select field from table t2 order by field) s from table t1  2. select t1.* from table...

Mysql拼接查询结果

Mysql拼接查询结果

如: 如下图,通常省市县都是单独存放在不同的表中的。 但是我们前端,还需要把省市县合成一个来展示例如下图中显示的收货地址。 实际上存放的:全是省市县编号 我们可以使用拼接来完成这个操作: 使用mysql的CO...

mysql查询 根据月份查询每天的数据 没有数据显示0

mysql查询 根据月份查询每天的数据 没有数据显示0

  mysql 查询 年月 每天的数据 没有数据的为0   表名 ceshi   查询2017年11月份每天的shuliang的和   SELECT DATE_FORMAT( le...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。