查询游戏历史成绩最高分前100
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;
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倍
查询当天游戏最好成绩
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的值都需要用函数计算一遍,需要调整为:
AND ps1.dateline >= UNIX_TIMESTAMP('$todaytime')
SELECT ps. *,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
对于每个球员,找出球员号码,名字以及他所引起的罚款的号码,但只是针对那些至少有两次罚款的球员。
SELECT PLAYERNO,NAME,NUMBER FROM (SELECT PLAYERNO,(SELECT COUNT(*) FROM PENALTIES WHERE PENALTIES.PLAYERNO = PLAYERS.PLAYERNO) AS NUMBER FROM PLYERS) AS PN WHERE NUMBER>=2
FROM子句中的子查询决定了每个球员的号码,名字和罚款的编号。接下来,这个号码变成了中间结果中的一列。然后指定了一个条件(NUMBER>=2);最后,获取SELECT子句中的列。
总结
以上就是本文关于MysqL子查询和嵌套查询优化实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:mysql in语句子查询效率慢的优化技巧示例、浅谈mysql的子查询联合与in的效率等,如有不足之处请留言,小编会及时更正。
感谢朋友们对编程小技巧网站的支持!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。