前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >查询top1数据 想到的关于select 返回数据的

查询top1数据 想到的关于select 返回数据的

作者头像
写PHP的老王
发布于 2019-08-12 07:38:19
发布于 2019-08-12 07:38:19
1.4K00
代码可运行
举报
文章被收录于专栏:写PHP的老王写PHP的老王
运行总次数:0
代码可运行

最近工作中有遇到查询分组第一条的问题,由此想到了一些关于 select 返回数据的顺序的几个问题。

select 返回数据的顺序在没有指定排序的情况下是不确定的,是一个集合。集合本身是没有顺序的!!

数据内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id    page_id        addtime
1       1           1558342663
2       1           1558348337
3       1           1558349079
4       2           1558348351
5       4           1558348372
6       3           1558348361
7       1           1558349140
8       1           1558399247
9       3           1558349702
10      1           1558399412
11      1           1558402590
12      1           1558408852

1. 对select的结果没有任何条件进行select,顺序是怎么样?

对于查询结果集直接进行select查询,特别是已排序的结果集,会改变数据的顺序。

query 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

id  page_id addtime
12  1   1558408852
11  1   1558402590
10  1   1558399412
8   1   1558399247
9   3   1558349702
7   1   1558349140
3   1   1558349079
5   4   1558348372
6   3   1558348361
4   2   1558348351
2   1   1558348337
1   1   1558342663

query 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

id  page_id addtime
1   1   1558342663
2   1   1558348337
3   1   1558349079
4   2   1558348351
5   4   1558348372
6   3   1558348361
7   1   1558349140
8   1   1558399247
9   3   1558349702
10  1   1558399412
11  1   1558402590
12  1   1558408852

2.先排序再分组,能否获取到分组第一条数据?

对于分组获取第一条数据,很多博客给的方案是先对数据进行排序,再对结果集进行分组,这样就能够获取到分组的第一条数据了。说实话,这个很符合逻辑,我之前确实也是这么想的。但是前提是排完序,到分组前,数据的顺序依然是排序后的顺序才可以。

第一个问题,其实已经说明了,对于一个排完序的结果集载进行一次查询,查询结果的顺序是会变化的,跟内层排序结果集并不是一致的。所以我们在顺序不正确的数据上进行分组,拿到的数据也必然是不准确的。

还是以最初的数据为例,需要按page_id进行分组,取每组中addtime最大的一条数据,正确的结果应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

id  page_id addtime
12  1   1558408852
9   3   1558349702
5   4   1558348372
4   2   1558348351

第一条sql,先排序,然后对结果集进行分组操作得到的结果是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id  page_id addtime
1   1   1558342663
4   2   1558348351
6   3   1558348361
5   4   1558348372

第二条sql,先排序,然后对结果集进行分组操作并排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

id  page_id addtime
5   4   1558348372
6   3   1558348361
4   2   1558348351
1   1   1558342663

第三条sql,先分组再排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

id  page_id addtime
5   4   1558348372
6   3   1558348361
4   2   1558348351
1   1   1558342663

可以看出,先排序再分组操作,并不能取得分组中的第一条数据!!!

如果想要获取分组中第一条,先分组,获取分组中排序字段最大或最小的排序字段值(addtime),然后通过排序字段(addtime),分组字段(page_id)与原数据进行连表操作,取出其他字段的数据。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
wget命令详解——批量下载等
(1)支持断点下传功能 (2)同时支持FTP和HTTP下载方式 (3)支持代理服务器 (4)设置方便简单 (5)程序小,完全免费 wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget [参数列表] URL。下面就结合具体的例子来说明一下wget的用法。 1、下载整个http或者ftp站点。
Qicloud
2022/01/28
13.1K0
wget命令详解(断点续传,批量下载)
[导读](1)支持断点下传功能 (2)同时支持FTP和HTTP下载方式 (3)支持代理服务器 (4)设置方便简单 (5)程序小,完全免费 wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget [参数列表] URL。下面就...
用户3765803
2019/03/05
14K0
Wget 大法wget 指定路径,指定文件名下载
图片 今天用到了Wget,突然一时间想不起来wget的下载到指定目录是哪个参数了,特地把所有参数都弄来,以防又忘记了。毕竟脚本是写了之后,半年都不用改,坑! 有
用户2353021
2020/05/09
10.5K0
python wget下载文件
-P PREFIX 将文件保存在目录(--directory-prefix=PREFIX)
py3study
2020/01/09
5.5K0
wget命令详解,断点续传[通俗易懂]
(1)支持断点下传功能 (2)同时支持FTP和HTTP下载方式 (3)支持代理服务器 (4)设置方便简单 (5)程序小,完全免费
全栈程序员站长
2022/09/05
10.1K0
linux的wget命令
Linux wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟主机,处理这样的事务我们只能先从远程服务器下载到我们电脑磁盘,然后再用ftp工具上传到服务器。这样既浪费时间又浪费精力,那不没办法的事。而到了Linux VPS,它则可以直接下载到服务器而不用经过上传这一步。wget工具体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来方便简单。下面我们以实例的形式说明怎么使用wget。
狼啸风云
2019/11/05
4.1K0
重新认识wget
Wget是平时经常会用到的一个工具,这个工具其实有着非常丰富的参数和配置,能够实现很强大的功能。比较常用的一个就是抓站或者为网站做镜像。
大江小浪
2018/07/25
1.1K0
wget常用命令详解
一、wget常用命令详解 wget命令是Linux系统用于从Web下载文件的命令行工具,支持 HTTP、HTTPS及FTP协议下载文件, 而且wget还提供了很多选项,例如下载多个文件、后台下载,使用代理等等,使用非常方便。 接下来就介绍一下wget的使用方法。 wget命令的使用 语法格式 wget [options] [url] #示例,默认下载目录当前目录下 wget https://down.sandai.net/thunder11/XunLeiWebSetup11
懿曲折扇情
2022/08/24
2.2K0
Linux下载工具wget使用
wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip 
kl博主
2023/11/18
6660
Linux wget 命令用法详解
Linux系统中的wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。
用户6543014
2019/10/25
5.3K0
WGet使用指南
wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.
一见
2018/08/07
1.1K0
每天一个linux命令(61):wget命令
http://www.cnblogs.com/peida/archive/2013/03/18/2965369.html
bear_fish
2018/09/20
2.2K0
windows安装wget命令_linux安装命令install
今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包。一般linux最小化安装时,wget不会默认被安装。
全栈程序员站长
2022/08/03
5.6K0
wget常用参数
****前言**** 一句话:wget不仅功能强大,使用极其简单的。 ---- ****wget特性**** 支持断点下传功能【important】 同时支持FTP和HTTP下载方式 支持代理服务器 设置方便简单 程序小,更是开源 ---- ****基本语法**** wget [参数列表] URL。 ---- ****常用参数**** 1、简单wget $wget http://www.example.com 2、递归下载 - 【下载整个网站资源】 $wget -r http://www.example
AlicFeng
2018/06/08
1.2K0
Linux网络下载管理工具(lftp, ftp, lftpget, wget)「建议收藏」
在Linux运维开发工作中,经常会使用到ftp工具,近来发现了一款比较趁手的工具,望读者喜欢。
全栈程序员站长
2022/09/03
2.4K0
Linux网络下载管理工具(lftp, ftp, lftpget, wget)「建议收藏」
linux应用之wget命令详解
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径
用户5640963
2019/07/26
2K0
文件查找下载命令
描述:在后台数据库中按文件名搜索,速度更快,通过/var/lib/mlocate内数据库记载找出用户输入的关键字文件名,它的更新速率默认是一天一次,Linux版本的不同名字不同Mac下在/var/db/locate.datebase; 根据距上次更新后更改的文件数目多少,速度不同并且只能通过文件名来搜索
全栈工程师修炼指南
2020/12/17
2.5K0
文件查找下载命令
客户端如何查找FTP服务器的用户名和密码
在互联网的早期阶段,FTP(文件传输协议)是一种非常常用的技术,它允许用户在计算机之间传输文件。然而,由于网络安全和隐私的考虑,许多FTP服务器现在都使用认证系统来限制用户的访问。因此,为了连接到FTP服务器,您通常需要知道用户名和密码。这篇文章将指导您如何在客户端查找FTP服务器的用户名和密码。
德迅云安全--陈琦琦
2023/11/03
1.9K0
win10系统下搭建FTP服务器(完成文件上传与下载)
FTP (File Transfer Protocol) 可说是最古老的协议之一了,主要是用来进行文件的传输,尤其是大型文件的传输使用 FTP 更是方便。
DS小龙哥
2022/01/17
34.7K0
win10系统下搭建FTP服务器(完成文件上传与下载)
Linux工具之curl与wget高级使用
# curl –s –o baidu.html www.baidu.com |iconv -f utf-8  #减少输出信息
子润先生
2021/06/17
1.2K0
相关推荐
wget命令详解——批量下载等
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验