
项目有个需求要获取用户销售额的排名,于是在 mysql 实现,但是当销售额都等于 0 的时候,排序是很不稳定的,每次获取都不一样,有什么好的解决方法呢
SELECT pos AS sort, amount, user_id AS userId FROM ( SELECT rank.*,@rank :=@rank + 1 AS pos FROM ( SELECT user_id, sale_amount amount FROM store UNION SELECT user_id, amount FROM store_rank ORDER BY amount DESC ) rank, (SELECT @rank := 0) B ) c WHERE user_id = 1015228275321995264 ; 1 ranleng 2022-09-06 16:40:38 +08:00 再以名字或者 user_id 排... |
2 chendy 2022-09-06 16:42:19 +08:00 加一个创建时间之类的排序做默认顺序 |
3 HHHHHQ 2022-09-06 16:51:49 +08:00 楼上两位正解。 |
4 wxf666 2022-09-06 16:59:45 +08:00 销售额都等于 0 时,排名不应该是一样的嘛。。 不考虑使用连 SQLite 都支持的窗口函数 rank() OVER(...) 嘛? |
6 wxf666 2022-09-06 17:25:03 +08:00 @simonlu9 啥意思。。 1. 你希望销售额相同的用户,他们的排名相同吗? 2. 你的 SQL 最里层的『 SELECT ... UNION SELECT ... ORDER BY ...』,每次获取,结果都一样吗? |
7 simonlu9 OP @wxf666 相同金额不获取的排名是不一样的,所以导致每次用户获取自己的排名不一样,所以单个字段排序是解决不了这个问题,第二个就是每次返回的结果都不一样 |
8 wxf666 2022-09-06 17:41:34 +08:00 |
9 frank1256 2022-09-06 17:47:32 +08:00 order by amount desc, id desc |
10 eason1874 2022-09-06 17:48:30 +08:00 排序条件写两个就行了,比如其他人说的,加上 id 排序 |
11 wineast 2022-09-06 17:55:22 +08:00 加一个第二排序即可,比如 id ,创建时间 etc |
12 simonlu9 OP @wxf666 谢谢你的热心回复了,我希望相同金额的用户排名是不一样的吗, 就是比如有系统有 100 个人销售额是 0 的,那我的排名是多少呢,现在要保证每个用户的排名都是不一样的, 上面的语句就每次返回的排名都不一样,很不稳定,所以相同销售额的排名不稳定,要额外加多一个字段,这种问题在延伸就会导致分页会出现重复的数据 |
13 ktqFDx9m2Bvfq3y4 2022-09-06 18:02:24 +08:00 加个排名字段定期更新?我之前就是这么干的,每小时更新排名。 |
14 zhuweiyou 2022-09-06 18:09:22 +08:00 相同的销售额, 排名应该相同才对, 参考 8 楼的图表. mysql 8 有排名函数. |
15 xiangyuecn 2022-09-06 18:13:03 +08:00 相同值的本身就是乱序,谁排前面看心情。 常规的是根据人名排序,这就是命,看投胎。 |
17 Xusually 2022-09-06 19:20:16 +08:00 via iPhone 简单的办法就是再加入一个不重复的排序,比如主键,user id 之类的 |
18 dobelee 2022-09-06 20:17:52 +08:00 这是产品需求不明确,一般这种全量排行榜会是多维的,会加上注册时间、活跃时间、ID 等二重排序来避免等分乱序。 |
19 fiveStarLaoliang 2022-09-07 17:45:23 +08:00 不要让它自己排序,手动加入排序规则,否则开发一时爽,维护火葬场 |