MYSQL子查询和嵌套查询优化实例解析
作者:dodomail 发布时间:2024-01-23 13:24:34
标签:mysql,子查询,嵌套
查询游戏历史成绩最高分前100
Sql代码
SELECT ps.* FROM cdb_playsgame ps WHERE ps.credits=(select MAX(credits)
FROM cdb_playsgame ps1
where ps.uid=ps1.uid AND ps.gametag=ps1.gametag) AND ps.gametag='yeti3'
GROUP BY ps.uid order by ps.credits desc LIMIT 100;
Sql代码
SELECT ps.*
FROM cdb_playsgame ps,(select ps1.uid, ps1.gametag, MAX(credits) as credits
FROM cdb_playsgame ps1 group by uid,gametag) t
WHERE ps.credits=t.credits AND ps.uid=t.uid AND ps.gametag=t.gametag AND ps.gametag='yeti3'
GROUP BY ps.uid order by ps.credits desc LIMIT 100;
执行时间仅为0.22秒,比原来的25秒提高了10000倍
查询当天游戏最好成绩
Sql代码
SELECT ps. * , mf. * , m.username
FROM cdb_playsgame ps
LEFT JOIN cdb_memberfields mf ON mf.uid = ps.uid
LEFT JOIN cdb_members m ON m.uid = ps.uid
WHERE ps.gametag = 'chuansj'
AND FROM_UNIXTIME( ps.dateline, '%Y%m%d' ) = '20081008'
AND ps.credits = (
SELECT MAX( ps1.credits )
FROM cdb_playsgame ps1
WHERE ps.uid = ps1.uid
AND ps1.gametag = 'chuansj'
AND FROM_UNIXTIME( ps1.dateline, '%Y%m%d' ) = '20081008' )
GROUP BY ps.uid
ORDER BY credits DESC
LIMIT 0 , 50
像查询里:
AND ps.credits=(SELECT MAX(ps1.credits)
FROM {$tablepre}playsgame ps1 where ps.uid=ps1.uid AND ps1.gametag = '$game'
AND FROM_UNIXTIME(ps1.dateline, '%Y%m%d') = '$todaytime' )
特别消耗时间
另外,像:
FROM_UNIXTIME(ps1.dateline, '%Y%m%d') = '$todaytime'
这样的语句会导致索引无效,因为对每个dataline的值都需要用函数计算一遍,需要调整为:
Sql代码
AND ps1.dateline >= UNIX_TIMESTAMP('$todaytime')
//更改后
Sql代码
SELECT ps. * , mf. * , m.username
FROM cdb_playsgame ps, cdb_memberfields mf, cdb_members m, (
SELECT ps1.uid, MAX( ps1.credits ) AS credits
FROM cdb_playsgame ps1
WHERE ps1.gametag = 'chuansj'
AND ps1.dateline >= UNIX_TIMESTAMP( '20081008' )
GROUP BY ps1.uid
) AS t
WHERE mf.uid = ps.uid
AND m.uid = ps.uid
AND ps.gametag = 'chuansj'
AND ps.credits = t.credits
AND ps.uid = t.uid
GROUP BY ps.uid
ORDER BY credits DESC
LIMIT 0 , 50
对于每个球员,找出球员号码,名字以及他所引起的罚款的号码,但只是针对那些至少有两次罚款的球员。
更紧凑的查询,在FROM子句中放置一个子查询。
Sql代码
SELECT PLAYERNO,NAME,NUMBER
FROM (SELECT PLAYERNO,NAME,
(SELECT COUNT(*)
FROM PENALTIES
WHERE PENALTIES.PLAYERNO =
PLAYERS.PLAYERNO)
AS NUMBER
FROM PLYERS) AS PN
WHERE NUMBER>=2
FROM子句中的子查询决定了每个球员的号码,名字和罚款的编号。接下来,这个号码变成了中间结果中的一列。然后指定了一个条件(NUMBER>=2);最后,获取SELECT子句中的列。
总结
感谢朋友们对脚本之家网站的支持!
来源:http://dodomail.iteye.com/blog/250199
0
投稿
猜你喜欢
- 目录一、问题描述:二、具体的实现:三、完整代码:一、问题描述:有一个shape为(308, 2)的二维数组,以及单独的一个数字,需要保存到c
- 需求:如下图所示实现sql语句SELECT A1,SUM(A2*A3) FROM A GROUP BY A1大家可以自行测试一下,主要需要了
- 一、算术运算符算术运算符是大部分情况下是实现对数值的运算,少部分可以实现对字符的操作运算符符号描述+加(可对字符进行拼接操作)-减*乘(可对
- 之前总结过flask里的基础知识,现在来总结下flask里的前后端数据交互的知识,这里用的是Ajax一、 post方法1、post方法的位置
- 先看map。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。举
- 前言 常用地图底图的绘制一般由Basemap或者cartopy模块完成,由于Basemap库是基于python2开发的一个模块,目前已经不开
- 去空格及特殊符号s.strip().lstrip().rstrip(',')Python strip() 方法用于移除字符串
- 1. 前言但是对于很多人来说,首先编写一款 App 需要一定的移动端开发经验,其次还需要另外编写无障碍服务应用,如此显得有一定难度的本篇文章
- 1.MS SCRIPT ENCODE基本上没什么用了,一段JS就可以破解2.封装成DLL比较可行的方法,有通过VB封装成DLL的例子,而且无
- 关于Mysql的触发器,基本上每个Mysql教程里都有讲到,但是我发现那些教程里讲的都是如何处理其他表的数据。在Mysql中写触发器操作本表
- 1. 安装 Git在 Windows 系统中安装Git非常简单,只需要下载Git的安装包,然后安装引导点击安装即可:Git下载地址:http
- 五花八门的SQL产品多得要命,或许你早顾不得其它甩开袖子就动手干了。但你要同时采用ASP和SQL的话就可能会头晕。MySQL、SQL Ser
- 本文实例讲述了Sanic框架异常处理与中间件操作。分享给大家供大家参考,具体如下:简介Sanic是一个类似Flask的Python 3.5+
- python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进
- 先让我们看一个例子,了解什么是模式化窗口。以下是QQ秀商城在非登录时提示登录的一种状态。当我在非登录状态,通过保存形象的方式买一件衣服时,弹
- 前言Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j
- 从PDF读取文本内容和从已经有的文档生成新的PDF。需要用到的模块是PyPDF2.mstamy2/PyPDF2: A utility to
- 两年前,我们开发了一套基于Flash的文件(主要是图片)上传RIA应用,提供给阿里巴巴的用户使用。如果你使用过Wordpress或flick
- 切片:切片指从现有列表中,获取一个子列表返回一个新列表,不影响原列表。下标以 0 开始:list = ['红','绿
- 本文实例讲述了python判断给定的字符串是否是有效日期的方法。分享给大家供大家参考。具体分析如下:这里python判断给定的字符串是否是一