MySQL实现排名并查询指定用户排名功能,并列排名功能

MySQL实现排名并查询指定用户排名功能,并列排名功能

表结构:

CREATE TABLE test.testsort (

id int(11) NOT NULL AUTO_INCREMENT,

uid int(11) DEFAULT 0 COMMENT ‘用户id‘,

score decimal(10, 2) DEFAULT 0.00 COMMENT ‘分数‘,

PRIMARY KEY (id)

)

ENGINE = INNODB

AUTO_INCREMENT = 1

CHARACTER SET utf8

COLLATE utf8_general_ci

COMMENT = ‘测试排序‘

ROW_FORMAT = DYNAMIC;

思路:可以先排序,再对结果进行编号;也可以先查询结果,再排序编号。

说明:

@rownum := @rownum + 1 中 := 是赋值的作用,这句话的意思是先执行@rownum + 1,然后把值赋给@rownum;

(SELECT @rownum := 0) r 这句话的意思是设置rownum字段的初始值为0,即编号从1开始。

实现排名:

方法一:

SELECT t.*, @rownum := @rownum + 1 AS rownum

FROM (SELECT @rownum := 0) r, (SELECT * FROM testsort ORDER BY score DESC) AS t;

方法二:

SELECT t.*, @rownum := @rownum + 1 AS rownum

FROM (SELECT @rownum := 0) r, testsort AS t

ORDER BY t.score DESC;

结果:

查看指定用户排名:

方法一:

SELECT b.* FROM

(

SELECT t.*, @rownum := @rownum + 1 AS rownum

FROM (SELECT @rownum := 0) r,

(SELECT * FROM testsort ORDER BY score DESC) AS t

) AS b WHERE b.uid = 222;

方法二:

SELECT b.* from

(

SELECT t.*, @rownum := @rownum + 1 AS rownum

FROM (SELECT @rownum := 0) r, testsort AS t

ORDER BY t.score DESC

) as b where b.uid = 222;

结果:

实现并列排名(相同分数排名相同):

SELECT

obj.uid,

obj.score,

CASE

WHEN @rowtotal = obj.score THEN

@rownum

WHEN @rowtotal := obj.score THEN

@rownum :[email protected] + 1

WHEN @rowtotal = 0 THEN

@rownum :[email protected] + 1

END AS rownum

FROM

(

SELECT

uid,

score

FROM

testsort

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0 ,@rowtotal := NULL) r

查询指定用户并列排名:

SELECT total.* FROM

(SELECT

obj.uid,

obj.score,

CASE

WHEN @rowtotal = obj.score THEN

@rownum

WHEN @rowtotal := obj.score THEN

@rownum :[email protected] + 1

WHEN @rowtotal = 0 THEN

@rownum :[email protected] + 1

END AS rownum

FROM

(

SELECT

uid,

score

FROM

testsort

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0 ,@rowtotal := NULL) r) AS total WHERE total.uid = 222;

原文地址:https://www.cnblogs.com/woods1815/p/9595494.html

时间: 2024-10-13 06:36:54

MySQL实现排名并查询指定用户排名功能,并列排名功能的相关文章

【mysql】存储过程,查询指定数据库、具体编码类型含有某字符串的所有表名和列名

1.需求:就是想在一个数据库中查找存在某字符串的表和列: 2.例子,我这里my_test数据库有3张表,test_replace的name.password列有张三字符串,t1表的name.city列也有张三字符串,t_user表就没有张三字符串. 运行结果 t1,name;t1,city;test_replace,name;test_replace,password 符合要求 3.代码 -- 1.将mysql分隔符从;设置为& DELIMITER & -- 2.如果存在存储过程getCo

MySQL通过POIN数据类型查询指定范围内数据

SELECT *, AsText(location) as 原始坐标数据, (st_distance(location, point(116.397915,39.908946))*111) AS distance FROM oc_district HAVING distance<100 ORDER BY distance limit 100; 原文地址:https://www.cnblogs.com/Soy-technology/p/10981124.html

Centos7 修改mysql指定用户的密码

1.登陆mysql或者mariadb(两种任选其一) [[email protected] ~]# mysql -u root [[email protected] ~]# mysql -uroot -p 2.切换到存储用户名和密码的数据库 MariaDB [mysql]> use mysql;回车,会显示以下内容 Reading table information for completion of table and column names You can turn off this fe

浅析微信支付:商户平台代金券或立减优惠开通、指定用户代金券发放、查询等

本文是[浅析微信支付]系列文章的第十四篇,主要讲解在如何开通商户平台的代金券或立减优惠功能,商家向指定用户发送代金券,查询发送记录,代金券信息等. 浅析微信支付系列已经更新十四篇了哟-,没有看过的朋友们可以看一下哦. 浅析微信支付:商户平台开通现金红包.指定用户发放.红包记录查询 浅析微信支付:(余额提现)企业付款到微信用户零钱或银行卡账户 浅析微信支付:支付验收示例和验收指引 浅析微信支付:如何使用沙箱环境测试 首先我们需要了解一下什么是代金券和立减优惠? 代金券是微信支付为商家提供的一个营销

浅析微信支付:商户平台开通现金红包、指定用户发放、红包记录查询

本文是[浅析微信支付]系列文章的第十三篇,主要讲解在如何开通商户平台的红包功能和为用户发放红包,以及查询发送红包记录. 浅析微信支付系列已经更新十三篇了哟-,没有看过的朋友们可以看一下哦. 浅析微信支付:(余额提现)企业付款到微信用户零钱或银行卡账户 浅析微信支付:支付验收示例和验收指引 浅析微信支付:如何使用沙箱环境测试 浅析微信支付:申请退款.退款回调接口.查询退款 上一篇文章我们说到,如果有余额提现.返利福利等需求时,就会用到商家向用户付款的操作,基于微信支付,上篇我们说了付款到用户余额和

web day15 数据库概述,MySQL,SQL语句,数据查询语法DQL

数据库管理系统(DBMS)的概述 1. 什么是DBMS:数据的仓库 > 方便查询 > 可存储的数据量大 > 保证数据的完整.一致 > 安全可靠 2. DBMS的发展:今天主流数据库为关系型数据库管理系统(RDBMS 使用表格存储数据) 3. 常见DBMS:Orcale.MySQL.SQL Server.DB2.Sybase 4. DBMS = 管理程序 + 多个数据库(DB) 5. DB = 多个table(不只是table,但这里先不介绍其他组成部分) 6. table的结构(即

MySQL里面的子查询

一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任何子句,比如:distinct. group by.order by.limit.join和union等:但是对应的外部查询必须是以下语句之一:select.insert.update.delete.set或 者do. 子查询的位置: select 中.from 后.where 中.group by 和order by

mysql索引原理与查询快慢

=========索引原理与慢查询======= 阅读目录 -     一.介绍 -     二.索引的原理 -     三.索引的数据结构 -     四.聚集索引与辅助索引 -     五.MySQL索引管理 -     六.测试索引 -     七.正确使用索引 -     八.联合索引与覆盖索引 -     九.查询优化神器-explain -     十.慢查询优化的步骤 -     十一.慢日志管理 一.介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般

MySQL重点内容:查询语句、名称解析

MariaDB安装方式:包管理器(rpm, deb)通用二进制格式:源码编译安装:SQL:数据库.表.索引.视图.存储过程.存储函数.触发器.事件调度器.用户和权限:元数据数据库:库名为mysqlMYSQL语句:有2种DDL, DMLDDL: CREATE, ALTER, DROPDML: INSERT, DELETE, UPDATE, SELECTDCL: GRANT(授权), REVOKE(撤销授权)MariaDB程序的组成:C/S架构C:Clientmysql:CLI交互式客户端程序:my