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

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

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版本
请大佬不吝赐教

附言 1  ·  5年前

我在ORDER BY前面加GROUP BY会报错,网上找了下需修改config/database.php里的strict为false
因为laravel5.3版本后strict严格为true,即使用GROUP BY会给每个字段都进行分组,改为false则只为你指定的字段分组

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
leo
最佳答案

select max(fraction) as fraction, user_id from fan_rankings group by user_id order by fraction desc limit 100

当然这样性能比较差。

FanRanking::query()->groupBy('user_id')->orderByDesc('fraction')->limit(100)->get(['user_id', \DB::raw('max(fraction) as fraction')])

5年前 评论
讨论数量: 3

本来就是按照分数从高到低排名,按照用户排序,取其中第一个就行,那么就想办法把GROUP_CONCAT结果提取分割符的第一个,使用substring等函数操作就行,不用那么复杂的....
最简单的还是用程序的方式解决..

5年前 评论
leo

select max(fraction) as fraction, user_id from fan_rankings group by user_id order by fraction desc limit 100

当然这样性能比较差。

FanRanking::query()->groupBy('user_id')->orderByDesc('fraction')->limit(100)->get(['user_id', \DB::raw('max(fraction) as fraction')])

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!