关于【MySQL】rank排名

前提,需求的来源是这样子的:公司业务中,我想知道某个商品,某一个时间段的销量排名,以下通过另外的例子进行选择。

首先看一张表格

表名字:app_role_copy【数据处理过】

问题:假设现在你是师傅,你想知道你的id从大到小排序,id排在所有id中的第几位。现在数据量少,用眼睛就很容易知道了,在数据大的情况下oracle要得到这个排序也比较容易,但是在mysql中并不容易。

这上面的表我们可以利用 order by id desc,很容易得到数据对id从大到小的排序。

SELECT * FROM app_role_copy AS a ORDER BY a.id DESC ;

select @rownum := @rownum + 1 rownum , role_name from (
        select @rownum := 0 , a.role_code , a.role_name from app_role_copy as a order by a.id desc )  t

我认为:引用中的斜体为建立的一个临时的表,且根据id排好,然后外面的select则把序号rownum赋值好对应的序号,其中 t 作为临时表的表名不能省略,所以得到如下的结果。

按照id从大到小,具有序号的排序结果

所以已经知道了师傅所在的排序。为了只得到师傅排名的结果,所以最后从得到的结果表按照筛选条件,即可得到最终结果。

最终结果

select rownum,role_name from (
        select @rownum := @rownum + 1 rownum , role_name from (
                select @rownum := 0 , a.role_code , a.role_name from app_role_copy as a order by a.id desc )  t ) y
where y.role_name ='师傅';

顺带吐槽一下,上了两三天的业务后,然后因为**,就下掉了。但是作为一个rank demo是合适的。

你可能感兴趣的:(关于【MySQL】rank排名)