排名查询结果如何去掉重复数据?

有一个用户排行榜表,需要按分数高低进行名次排序并输出,如有重复用户的,取该用户的最高分
现在我是这样写的

DB::select("SELECT nickname, id, fraction, FIND_IN_SET( fraction, (    
                    SELECT GROUP_CONCAT( fraction
                    ORDER BY fraction DESC ) 
                    FROM fan_rankings WHERE test_id=$test_id)
                    ) AS rank
                    FROM fan_rankings
                    WHERE test_id = $test_id AND user_id = $user->id ORDER BY fraction DESC");

我在ORDER BY 前加了个GROUP BY(user_id),但是有报错,请教下有什么办法
还有怎么用ORM的写法来呢,感觉用原生的写有点复杂
本人使用的laravel5.4版本
请大佬不吝赐教

阅读 3k
3 个回答
FanRanking::query()->groupBy('user_id')->orderByDesc('fraction')->limit(100)->get(['user_id', \DB::raw('max(fraction) as fraction')])

在laravel社区某个大佬的回答,看起来简洁又有用!

DB::select("SELECT distinct nickname, id, fraction, FIND_IN_SET( fraction, (    
                    SELECT GROUP_CONCAT( fraction
                    ORDER BY fraction DESC ) 
                    FROM fan_rankings WHERE test_id=$test_id)
                    ) AS rank
                    FROM fan_rankings
                    WHERE test_id = $test_id AND user_id = $user->id ORDER BY fraction DESC");

试试加一个distinct

用redis来搞吧! mysql 根本不适合做实时排行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题