技术饭

PHP查询用户排名名次、Mysql查询用户排名名次的方法

copylian    0 评论    1379 浏览    2020.12.05

PHP查询用户排名名次、Mysql查询用户排名名次的方法,最近做了用户排行榜,那么就整理了查询用户排行的一些代码,主要分为两部分:PHP、Mysql两者独立查询用户排名信息,当然查询的是所有用户的排名以及当前用户的排名信息。

假设我们有一张用户表:

1607172261(1).png

1、PHP查询方法:直接使用PHP的方式并不是特别推荐的方式,如果数据多的话,筛选可能就比较慢

//获取当前用户信息

$where = [];

$where[] = ['status', '=', 1];

$userinfo = \Db::name('user')->field('openid,nickname,score,last_score_time')->where($where)->find();


//获取积分列表,限制1000条

$where = [];

$where[] = ['status', '=', 1];

$where[] = ['score', 'gt', 0];

$ranking = \Db::name('user')->field('openid,nickname,score,last_score_time')->where($where)->order('score desc,last_score_time asc')->limit(1000)->select();


//数据

$data = [];


//当前用户默认排名

$data['user']['openid'] = $userinfo['openid'];

$data['user']['nickname'] = $userinfo['nickname'];

$data['user']['score'] = $userinfo['score'];

$data['user']['last_score_time'] = $userinfo['last_score_time'];

$data['user']['ranking'] = "1000+"; //超过1000的就显示1000+

if(!empty($ranking)){

      foreach ($ranking as $key => $value) {

            //排名

            $ranking_name = $key + 1;

            $ranking[$key]['ranking'] = $ranking_name;


            //当前用户排名

            if($value['openid'] == $params['openid']){

                        $data['user']['openid'] = $value['openid'];

                        $data['user']['nickname'] = $value['nickname'];

                        $data['user']['score'] = $value['score'];

                        $data['user']['last_score_time'] = $value['last_score_time'];

                        //排名

                        $data['user']['ranking'] = $ranking_name;

            }

      }

}


//排名列表,取100个

$data['list'] = array_slice($ranking, 0, 100);


2、Mysql查询方法:推荐方式,直接使用mysql查询是比较方便的,也可以结合PHP原生mysql语句查询

1)、查询所有排名信息

查询语句:

SELECT 

     p.openid,

     p.nickname,

     p.score,

     @rownum := @rownum + 1 AS rownum 

FROM

     (SELECT 

          @rownum := 0) r,

     (SELECT 

          * 

     FROM

          `aikehou_wechat_bljl_user` 

     WHERE score > 0 

     ORDER BY score DESC,

          last_score_time ASC LIMIT 1000) AS p


查询结果:

1607173196(1).png


2)、查询当前用户排名信息

查询语句:

SELECT 

     b.openid,

     b.nickname,

     b.score,

     b.rownum 

FROM

     (SELECT 

          t.*,

          @rownum := @rownum + 1 AS rownum 

     FROM

          (SELECT 

               @rownum := 0) r,

          (SELECT 

               * 

          FROM

               `aikehou_wechat_bljl_user` 

          WHERE score > 0 

          ORDER BY score DESC,

          last_score_time ASC) AS t) AS b 

WHERE b.openid = "oHL30wVEuI58L22gp8dkQ23232mSSW4dU4g";


查询结果:

1607173295(1).png


解释:

1、SELECT @rownum := 0:表示对rownum赋初始值0

2、@rownum := @rownum + 1:表示对rownum加1,语句中会从1开始,每一行往下都自动加1

3、所有用户排名是先对用户表进行积分排序,然后对名次进行累加;当前用户排名,就是在筛选出所有用户排名的基础上再进行当前用户信息进行筛选,说白了就是Mysql的组合查询

飓风呀
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
PHP Mysql 排名 名次 

文明上网理性发言!

  • 还没有评论,沙发等你来抢