这是原始数据,并希望根据得分(count(tbl_1.id))对它们进行排名.

[tbl_1]

===========

id | name

===========

1 | peter

2 | jane

1 | peter

2 | jane

3 | harry

3 | harry

3 | harry

3 | harry

4 | ron

因此,制作临时表(tbl_2)来计算每个id的分数.

SELECT id, name, COUNT( id ) AS score

FROM tbl_1

GROUP BY id

ORDER BY score DESC;

LIMIT 0, 30;

然后结果是;

[tbl_2]

===================

id | name | score

===================

3 | harry | 4

1 | peter | 2

2 | jane | 2

4 | ron | 1

然后查询这个;

SELECT v1.id, v1.name, v1.score, COUNT( v2.score ) AS rank

FROM votes v1

JOIN votes v2 ON v1.score < v2.score

OR (

v1.score = v2.score

AND v1.id = v2.id

)

GROUP BY v1.id, v1.score

ORDER BY v1.rank ASC, v1.id ASC

LIMIT 0, 30;

然后结果是;

==========================

id | name | score | rank

==========================

3 | harry | 4 | 1

1 | peter | 2 | 2

2 | jane | 2 | 2

4 | ron | 1 | 4

是否可以很好地在一个事务(查询)中执行此操作?

最佳答案 是的,可以在单个查询中执行此操作.但它在MySQL中是一个完整的毛球,因为MySQL没有简单的ROWNUM操作,你需要一个用于排名计算.

这是您显示排名的投票查询. @ranka变量用于对行进行编号.

SELECT @ranka:=@ranka+1 AS rank, id, name, score

FROM

(

SELECT id,

name,

COUNT( id ) AS score

FROM tbl_1

GROUP BY id

ORDER BY score DESC, id

) votes,

(SELECT @ranka:=0) r

正如您已经发现的那样,您需要自行加入此项以获得正确的排名(正确处理关系).因此,如果您接受查询并将两个引用替换为您的投票表,每个引用都有自己的子查询版本,那么您将获得所需的内容.

SELECT v1.id,

v1.name,

v1.score,

COUNT( v2.score ) AS rank

FROM (

SELECT @ranka:=@ranka+1 AS rank,

id,

name,

score

FROM

(

SELECT id,

name,

COUNT( id ) AS score

FROM tbl_1

GROUP BY id

ORDER BY score DESC, name

) votes,

(SELECT @ranka:=0) r) v1

JOIN (

SELECT @rankb:=@rankb+1 AS rank,

id,

name,

score

FROM

(

SELECT id,

name,

COUNT( id ) AS score

FROM tbl_1

GROUP BY id

ORDER BY score DESC, name

) votes,

(SELECT @rankb:=0) r) v2

ON (v1.score < v2.score) OR

(v1.score = v2.score AND v1.id = v2.id)

GROUP BY v1.id, v1.score

ORDER BY v1.rank ASC, v1.id ASC

LIMIT 0, 30;

告诉你这是一个毛球.请注意,在您自行加入的子查询的两个版本中需要不同的@ranka和@rankb变量,以使行编号正常工作:这些变量在MySQL中具有连接范围,而不是子查询范围.

编辑:使用PostgreSQL的RANK()函数更容易做到这一点.

SELECT name, votes, rank() over (ORDER BY votes)

FROM (

SELECT name, count(id) votes

FROM tab

GROUP BY name

)x

php mysql 排名算法_MySQL PHP:优化排名查询和计数子查询相关推荐

  1. mysql tcp性能优化_MySQL性能优化: 使用pt-query-digest分析慢查询日志

    一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...

  2. mysql 连接 监控_mysql监控优化(一)连接数和缓存

    一.mysql的连接数 MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放 ...

  3. mysql架构深入_mysql性能优化2:深入认识mysql体系架构

    前言 本文将重点梳理mysql的体系架构,便于了解mysql的实现原理. Mysql体系结构 Client Connectors 接入方 支持协议很多 Management Serveices &am ...

  4. mysql locate索引_MYSQL索引优化

    1.查看sql的执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.show [session|global] stat ...

  5. mysql 慢查询优化_MySQL 性能优化之慢查询

    性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句 其次使用explain命令去查询由问题的SQL的执行计划(脑补链接:点我直达1,点我直达2) 最后可以使用show pro ...

  6. mysql 性能日志_Mysql系列(十一)—— 性能分析慢查询日志

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志 ...

  7. mysql limit 算法_MySQL的limit用法及优化(转)

    常规用法: 用法一: SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2 OFFSET 1; 比 ...

  8. 修改mysql+io算法_MySQL磁盘IO设置问题

    下面的部分内容来自<深入浅出MySQL>.老叶的视频.网上其他人的blog. 这里列出的是MySQL的一些非运行参数的优化部分,具体如下: (对于使用云主机的用户,下文中的部分优化方法是无 ...

  9. seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_网站seo优化排名,网络推广的优化服务...

    网站seo排名优化软件,seo优化推广 一个好词上首页后需要的就是有稳定流量和有其他的关键词和长尾词带动它的排名,这样才不会掉下来了,但是时间长也是会掉的.那么就需要给自己的网站铺垫好流量和点击了,前 ...

最新文章

  1. autoware定位:gnss定位与lidar定位(四)
  2. android播放页蒙层过渡效果,EasyGuideLayer: 这可能是最简单、灵活、强大的页面蒙层组件了!...
  3. dataframe在groupby之后,选其中的某列作为画图的新index
  4. MySQL常见备份与恢复方案
  5. ERP中的合并会计报表
  6. php框架 zend,模型部分的php设计模式[php zend框架]
  7. 关于axios+spring boot无法进行重定向的问题
  8. 心语收集7:这就是人生,不要只顾着往前冲,要记得看看周围的景色,要想着你能留下点什么。...
  9. Monte Carlo采样
  10. ipynb--pdf
  11. logisim设计CPU
  12. 2022年最新过DD检测方法dd防检测方法
  13. scrapy爬取快代理并保存mongo数据库
  14. pc套件 无法连接pc CDC Comms Interface
  15. 大学里青年教师待遇真的很低吗?
  16. con 元器件符号_PROTEUS中元器件符号
  17. 河南省赛 导弹发射 lis
  18. 全球与中国聚 (3,4-亚乙基二氧噻吩) (PEDOT)市场“十四五”规划及远景目标的建议报告2022-2028年
  19. 【verilog】多功能数字钟的设计
  20. Blob开头视频链接如何下载

热门文章

  1. 构建微服务:Spring boot 入门篇
  2. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)...
  3. 升级nginx,查看已经安装的模块,并隐藏或者修改版本号
  4. 一个行外人看中国的电子竞技
  5. 5月8日全国软考办专家做客51CTO谈:软考政策、考前复习方法及考场技巧
  6. leetcode 1838. 最高频元素的频数
  7. leetcode632. 最小区间(堆+多指针)
  8. mongodb atlas_如何使用MongoDB Atlas将MERN应用程序部署到Heroku
  9. react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
  10. RabbitMQ学习系列(二): RabbitMQ安装与配置