Mysql根据指定字段的int值查出在当前列表的排名

先看表结构和数据:

DROP TABLE IF EXISTS `ndb_record`;
CREATE TABLE `ndb_record` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘测量记录‘,
  `user_id` bigint(20) NOT NULL COMMENT ‘用户id‘,
  `yellow` int(11) DEFAULT NULL COMMENT ‘黄色状态持续时长‘,
  `green` int(11) DEFAULT NULL COMMENT ‘绿色状态持续时长‘,
  `blue` int(11) DEFAULT NULL COMMENT ‘蓝色状态时长‘,
  `create_time` date DEFAULT NULL COMMENT ‘测量时间‘,
  `week` varchar(20) DEFAULT NULL COMMENT ‘周几‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of ndb_record
-- ----------------------------
INSERT INTO `ndb_record` VALUES (‘17‘, ‘13‘, ‘8‘, ‘7‘, ‘6‘, ‘2017-03-23‘, ‘星期四‘);
INSERT INTO `ndb_record` VALUES (‘18‘, ‘13‘, ‘8‘, ‘7‘, ‘6‘, ‘2017-03-22‘, ‘星期三‘);
INSERT INTO `ndb_record` VALUES (‘19‘, ‘13‘, ‘8‘, ‘7‘, ‘6‘, ‘2017-03-20‘, ‘星期一‘);
INSERT INTO `ndb_record` VALUES (‘20‘, ‘13‘, ‘8‘, ‘7‘, ‘6‘, ‘2017-03-19‘, ‘星期日‘);
INSERT INTO `ndb_record` VALUES (‘21‘, ‘13‘, ‘8‘, ‘7‘, ‘6‘, ‘2017-03-18‘, ‘星期六‘);
INSERT INTO `ndb_record` VALUES (‘22‘, ‘13‘, ‘8‘, ‘7‘, ‘8‘, ‘2017-03-23‘, ‘星期四‘);
INSERT INTO `ndb_record` VALUES (‘23‘, ‘13‘, ‘8‘, ‘7‘, ‘1‘, ‘2017-03-20‘, ‘星期一‘);
INSERT INTO `ndb_record` VALUES (‘24‘, ‘13‘, ‘8‘, ‘7‘, ‘2‘, ‘2017-03-14‘, ‘星期二‘);
INSERT INTO `ndb_record` VALUES (‘25‘, ‘13‘, ‘8‘, ‘7‘, ‘3‘, ‘2017-03-17‘, ‘星期五‘);
INSERT INTO `ndb_record` VALUES (‘26‘, ‘13‘, ‘8‘, ‘7‘, ‘4‘, ‘2017-03-16‘, ‘星期四‘);
INSERT INTO `ndb_record` VALUES (‘27‘, ‘12‘, ‘8‘, ‘7‘, ‘4‘, ‘2017-03-21‘, ‘星期二‘);
INSERT INTO `ndb_record` VALUES (‘28‘, ‘12‘, ‘8‘, ‘7‘, ‘4‘, ‘2017-03-20‘, ‘星期一‘);
INSERT INTO `ndb_record` VALUES (‘29‘, ‘12‘, ‘8‘, ‘7‘, ‘4‘, ‘2017-03-20‘, ‘星期一‘);
INSERT INTO `ndb_record` VALUES (‘30‘, ‘12‘, ‘6‘, ‘7‘, ‘4‘, ‘2017-03-19‘, ‘星期日‘);
INSERT INTO `ndb_record` VALUES (‘31‘, ‘12‘, ‘6‘, ‘7‘, ‘3‘, ‘2017-03-18‘, ‘星期六‘);
INSERT INTO `ndb_record` VALUES (‘32‘, ‘16‘, ‘6‘, ‘7‘, ‘3‘, ‘2017-03-16‘, ‘周四‘);
INSERT INTO `ndb_record` VALUES (‘33‘, ‘16‘, ‘6‘, ‘7‘, ‘3‘, ‘2017-03-31‘, ‘周五‘);
INSERT INTO `ndb_record` VALUES (‘34‘, ‘16‘, ‘6‘, ‘6‘, ‘0‘, ‘2017-04-05‘, ‘周三‘);

她给出的问题是,通过这条Sql语句统计了每个字段的总和,然后找出指定user_id关联times总和的排名

SELECT user_id,(SUM(yellow)+SUM(green)+SUM(blue)) AS times FROM ndb_record GROUP BY user_id;

查询出的结果是:

我给出了两种方法一条SQL实现。

第一种

 SELECT o_d FROM (SELECT a.*,
       @rownum := @rownum + 1 AS o_d
  FROM (
SELECT user_id,(SUM(yellow)+SUM(green)+SUM(blue)) AS times FROM ndb_record GROUP BY user_id ORDER BY times DESC
) a,
       (SELECT @rownum := 0) r) b WHERE user_id =13

第二种

SELECT
    count(*) AS o_d
FROM
    (
        SELECT
            user_id,
            (
                SUM(yellow) + SUM(green) + SUM(blue)
            ) AS times
        FROM
            ndb_record
        GROUP BY
            user_id
    ) a
WHERE
    times >= (
        SELECT
            times
        FROM
            (
                SELECT
                    user_id,
                    (
                        SUM(yellow) + SUM(green) + SUM(blue)
                    ) AS times
                FROM
                    ndb_record
                GROUP BY
                    user_id
            ) b
        WHERE
            `user_id` = 13
    )

查询结果也是跟第一种一样。

可能以上说明您没太明白,然后我再拿一条简单的表举例:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘,
  `name` varchar(22) NOT NULL DEFAULT ‘‘ COMMENT ‘姓名‘,
  `age` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘年龄‘,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

表创建好了,看后查看一下结果SELECT * FROM test:

比如,我们要查的是王五在这五个人里年龄排第几,目测赵六是老大,也就是排名第一,刘七老五,排名第五。

上语句:

select * from (SELECT t.*,
       @rownum := @rownum + 1 AS o_d
  FROM (
select * from test order by age desc
) t,
       (SELECT @rownum := 0) r) b where id =1

查询的条件是id=1,也就是张三,结果是4.

SELECT count(*) AS o_d FROM (SELECT age FROM test) a WHERE age >= (SELECT age FROM (SELECT * FROM test)
 b WHERE `id`=‘1‘);

完毕。

虽然结果出来了,还请前辈们多多指教哪里的不足!致敬!~

时间: 2024-10-14 00:22:23

Mysql根据指定字段的int值查出在当前列表的排名的相关文章

利用Entity Framework修改指定字段中的值

利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码: [HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAct

MySQL 按指定字段自定义列表排序

[转]http://www.php42.com/index.php/database/35-sql/237-mysql-order-by-list 问题描述 大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` WHERE `id` IN (1, 7, 3, 5) ORDER BY `id` ASC 降序排列的 SQL 为: SELECT * FROM `MyTable` WHERE `id` IN (1, 7,

MySQL查询某个字段为某值的次数统计SQL语句

SELECT GoodID,sum(if(Level = 1, 1, 0)) as Better,sum(if(Level = 0, 1, 0)) as Nomal,sum(if(Level = -1, 1, 0)) as Bad from evaluates GROUP BY GoodID;

查询字段的默认值

--使用在SQL2008,***查询字段说明和默认值 select object_name(c.id) as 表名 ,c.name as 字段名 ,t.name as 数据类型 ,c.prec as 长度 , p.value as 字段说明 ,m.text as 默认值 from syscolumns c inner join systypes t on c.xusertype=t.xusertype left join sys.extended_properties p on c.id=p.m

mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么

详解mysql int类型的长度值 mysql在建表的时候int类型后的长度代表什么 是该列允许存储值的最大宽度吗 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代表允许存储的宽度,但却没有一个合理的解释. 或者说对这个长度也没有真正的研究过到底代表什么, 平时都用int(11), 也不知道为什么要11位. 所以我在网上查阅了一些资料, 也仔细的看了mysql手册关于int data type的说法. 以下是每个整数类型的存储和范围

mysql修改表中某个字段的默认值

Mysql中用SQL增加.删除字段,修改字段名.字段类型.注释,调整字段顺序总结 在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的mysql管理工具中完成,但是我们有时为了更方便的管理,会选择写sql语句来实现. 1.增加一个字段  代码如下 复制代码 //增加一个字段,默认为空alter table user add COLUMN new1 VA

MySQL为数据表的指定字段插入数据

username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 为数据表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其它字段的值为数据表定义时的默认值. 基本的语法格式如下: INSERT INTO 表名(字段1,字段2,...,字段m) VALUES(值1,值2,...,值m); 字段1,字段2,...,字段m:表示数据表中的字段名称

Go创建及结构体变量是指定字段值

package main import ( "fmt" ) type Stu struct { Name string Age int } func main() { //方式1 //在创建结构体变量时,就直接指定字段的值 var stu1 = Stu{"小明", 19} // stu1---> 结构体数据空间 stu2 := Stu{"小明~", 20} //类型推导并省略var //在创建结构体变量时,把字段名和字段值写在一起, 这种写

MySQL批量替换指定字段字符串

MySQL批量替换是我们经常会用到的功能,有时站内包含敏感词,会给我们带来麻烦,而在信息量较大的情况下,一篇篇查找.修改是不现实的. 用MySQL批量替换,甚是轻松.发布在这里供参考,以备不时之需. MySQL批量替换指定字段字符串语句 UPDATE 数据表名 SET 字段名 = replace(字段名, '要替换的字符串', '替换为') WHERE 设定条件; 比如本站今天发现站内关于linux命令的文章 标题不是太好,以前都是以 linux下mkdir命令使用详解---linux创建目录命