从用户表中按 jifen_all 获取我的排名。
SELECT b.rank FROM ( SELECT t.id, @rownum := @rownum + 1 AS rank FROM (SELECT @rownum := 0) r, (SELECT id FROM fa_bankgy_dsxx_user ORDER BY jifen_all DESC) AS t ) AS b WHERE b.id = 29605;
表
CREATE TABLE `fa_bankgy_dsxx_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nickname` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, `openid` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `avatar` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `realname` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL, `mobile` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL, `province` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, `city` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL, `area` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, `workunit` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `exchange_count` int(11) DEFAULT '0', `dati_count` int(11) DEFAULT '0' COMMENT '答题次数', `rank_fen` int(11) DEFAULT '0', `jifen_all` int(255) DEFAULT '0', 累计积分数量 `jifen` int(11) NOT NULL DEFAULT '0', `createtime` int(11) NOT NULL, `updatetime` int(11) NOT NULL, `deletetime` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `jifen_all` (`jifen_all`), KEY `openid` (`openid`), KEY `workunit` (`workunit`) ) ENGINE=MyISAM AUTO_INCREMENT=33259 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
jifen_all 加了索引,怎么避全表扫描又能取出排名?
![]() | 1 F281M6Dh8DXpD1g2 2021-06-11 15:25:57 +08:00 mysql 就这样了 |
![]() | 2 chaucerling 2021-06-11 15:32:00 +08:00 你这里 filesort 肯定是没索引好,8.0 之后可以建倒序索引 |
![]() | 3 npe 2021-06-11 15:35:20 +08:00 Redis Zrank |
4 mxT52CRuqR6o5 2021-06-11 15:37:21 +08:00 这种排名好像一般都不是实时的吧 |
![]() | 5 limuyan44 2021-06-11 15:38:57 +08:00 求排名不是 count 一下就好了吗为啥要拿变量求 |
6 chenqh 2021-06-11 15:39:23 +08:00 select count 不久好了吗? |
![]() | 7 Thinklong 2021-06-11 15:51:01 +08:00 好家伙,直接 MySQL 编程了呀,如果只是一个用户一条数据、并且不考虑同分排名,直接 count,并且 jifen_all 大于等于当前用户的 jifen_all (可以子查询也可以单查再传参) count 结果就是你的排名 |
![]() | 8 Actrace 2021-06-11 15:54:36 +08:00 ![]() 尽量不要在数据库里搞编程。 哪怕是把数据取出来计算完逻辑再放临时表排序都比直接计算来的快很多。毕竟数据库的算力是很宝贵的,而且大多数数据库只对排序做了优化。 |
![]() | 9 dapang1221 2021-06-11 15:56:01 +08:00 你这又是计算又是 select 套娃……建议分几次查询,在业务里解决 |
![]() | 10 wowo243 2021-06-11 15:56:14 +08:00 丢 redis 或者直接拿内存里做,就几万条数据而已 |
![]() | 11 QiangZai 2021-06-11 15:56:54 +08:00 根据同样的需求写了一个:SELECT count( * ) FROM student_user WHERE login_count >= ( SELECT login_count FROM student_user WHERE id = 24 ) |
![]() | 12 edk24 OP |
13 polymerdg 2021-06-11 16:07:20 +08:00 上 可以 |
14 2kCS5c0b0ITXE5k2 2021-06-11 16:11:00 +08:00 排名其实不需要做实时的嘛 |