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,如图;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)