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

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

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  ·  1天前

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
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')])

4天前
讨论数量: 3

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

4天前
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')])

4天前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!