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

查看第一条:

SELECT

group_concat(id ORDER BY `create_time` DESC)

FROM

`user`

GROUP BY

user_code

select top 1 * from book 不对,因为mysql里没有top这种写法,它用limit。

扩展资料:

1、查看最后一条

mysql:

select * from table order by id DESC limit 1

oracle:

select * from emp where id in (select max(id) from emp)

2、查询前n行记录

select * from table1 limit 0,n或select * from table1 limit n

3、查询后n行记录

select * from table1 order by id desc dlimit n;//倒序排序,取前n行,id为自增形式

1、开启电脑,并打开mysql的数据库,在数据库中点击并进入右上的查询,在点击查询下面的新建查询。如图

2、接下来就可以输入SELECT * from crew_1 order by gmt_create这个语句,然后表中的所有记录就会按时间排序查询。如图。

3、如果需要获取表中按时间排序的第一条记录,就输入SELECT * from crew_1 order by gmt_create desc limit 0,1,如图

4、如果需要获取第5条记录,就输入SELECT * from crew_1 order by gmt_create desc limit 4,1如图:

5、如果需要获取第1001条记录,只需要将limit 4,1改成limit 1000,1,如果需要获取第n条记录,查询语句加入limit n-1,1就可以了,如图:

6、如果需要获取表中前n条记录,改成limit n,如图;


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存