mysql分组排序,取每组第一条数据

mysql分组排序,取每组第一条数据,第1张

MySQL:5.7

SQL语句的写法:

思路:先进行排序,然后再进行分组,获取每组的第一条。

derived_merge指的是一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率。这个特性在MySQL5.7版本中被引入,可以通过如下SQL语句进行查看/开启/关闭等 *** 作。

上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性,不怎么受欢迎,容易引起错误。

假设我们现在把sql中的 distinct(a.id) tid ,去掉,会发现子查询(或者叫:临时表)中的order by a.id desc失效了。

为什么会这样呢?

原理分析:

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

一旦外部表使用了group by, 那么临时表(派生表 derived table)将不会执行filesort *** 作(即 order by 会被忽略 )。之后我使用了limit可以使其生效,原因是因为要使派生表order by生效, 派生表可以通过使用group by、limit、having、distinct等等使其生效 (方法有好多,详情可看文档 https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html )

原文链接:

https://blog.csdn.net/u013066244/article/details/116461584

mysql不支持first函数,如果数据表里含有自增id字段的,可以利用该字段单纯依靠sql语句实现检索出每组的第一条记录,否则就要使用系统开销很大的游标来解决了。

下面提供一个利用自增id来只显示每个分类第一条记录的纯sql语句方案供参考:

select

a.*

from

t1

a,

(select

分组字段,min(id)

as

id

from

t1

group

by

分组字段)

b

where

a.id=b.id


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5915785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-08
下一篇 2023-03-08

发表评论

登录后才能评论

评论列表(0条)

保存