随笔 - 9,  文章 - 0,  评论 - 0,  阅读 - 8700

// 表数据

/*
Navicat MySQL Data Transfer
Target Server Type    : MYSQL
Target Server Version : 50734
File Encoding         : 65001

Date: 2022-06-09 11:28:52
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for hzw_testsort
-- ----------------------------
DROP TABLE IF EXISTS `hzw_testsort`;
CREATE TABLE `hzw_testsort` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT '0' COMMENT '用户id',
  `name` varchar(30) DEFAULT NULL,
  `score` decimal(10,2) DEFAULT '0.00' COMMENT '分数',
  `class` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='测试排序';

-- ----------------------------
-- Records of hzw_testsort
-- ----------------------------
INSERT INTO `hzw_testsort` VALUES ('1', '1', '张三', '10.00', '数学');
INSERT INTO `hzw_testsort` VALUES ('2', '2', '李四', '8.00', '数学');
INSERT INTO `hzw_testsort` VALUES ('4', '4', '老六', '10.00', '数学');
INSERT INTO `hzw_testsort` VALUES ('5', '1', '张三', '6.00', '语文');
INSERT INTO `hzw_testsort` VALUES ('6', '2', '李四', '8.00', '语文');
INSERT INTO `hzw_testsort` VALUES ('7', '3', '王五', '8.00', '语文');
INSERT INTO `hzw_testsort` VALUES ('8', '4', '老六', '7.00', '语文');
INSERT INTO `hzw_testsort` VALUES ('9', '1', '张三', '8.00', '英语');
INSERT INTO `hzw_testsort` VALUES ('10', '2', '李四', '8.00', '英语');
INSERT INTO `hzw_testsort` VALUES ('11', '3', '王五', '9.00', '英语');
INSERT INTO `hzw_testsort` VALUES ('12', '3', '王五', '9.00', '数学');
INSERT INTO `hzw_testsort` VALUES ('13', '4', '老六', '8.00', '英语');

// 排名测试

// 1 统计分数,并按总分数排序
$sql1 = "SELECT uid,name,sum(score) as total FROM `hzw_testsort` GROUP BY `uid` ORDER BY `total` DESC LIMIT 4"; 

// 2 为第一步的数据添加一个排名字段: rownum
$sql2 = "SELECT t.*, @rownum := @rownum + 1 AS rownum FROM (SELECT @rownum := 0) r," . "(" . $sql1 . ") as t";

// 3 从第二步的数据中取出指定人的数据(如果指定人不在第二步的数据中,将获取不到)
$sql3 = "SELECT b.* FROM " . "(" . $sql2 . ") as b where b.uid = 1";

// 执行sql

$sql = $sql3;
$list = Db::query($sql);

测试环境是在thinkphp5.1中测试,Db::query()是thinkphp5.1执行数据库查询语句的方法。
@rownum := @rownum + 1 中 := 是赋值的作用,这句话的意思是先执行@rownum + 1,然后把值赋给@rownum;
(SELECT @rownum := 0) r 这句话的意思是设置rownum字段的初始值为0,即编号从1开始。

posted on   李柯游-likeyou  阅读(462)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示