自己做的一个小项目里需要用mysql计算一些信息。

mysql中的 表如下(注:表中数据都是测试数据,随机生成的)

mysql> select * from shake_log;
+-----+-------------+--------+---------------------+------+
| id | mobile | credit | time | type |
+-----+-------------+--------+---------------------+------+
| | | 1.3 | -- :: | |
| | | 0.3 | -- :: | |
| | | 0.3 | -- :: | |
| | | 0.2 | -- :: | |
| | | 0.5 | -- :: | |
。。。。。。
。。。。。。
| | | 0.5 | -- :: | |
| | | 0.2 | -- :: | |
| | | 0.2 | -- :: | |
| | | 0.3 | -- :: | |
。。。。。。
。。。。。。

这张表的含义是这样的,每一条记录代表一次获益,而每个mobile的获益就是当天所有的记录的累加和。

例如上面的记录18369905226有三条记录,那么他今天的获益就是 0.5+0.2+0.2+0.3 = 1.2

1. 求获益最多的mobile和值

select mobile, sum(credit) as sumCredit from shake_log where time between '2014-12-06 00:00:00' and '2014-12-06 23:59:59' group by mobile order by sumCredit desc limit 1;

修改成hql语句,在java中如下:

public CreditRank queryRank(int year, int month, int day) {

        String hql = "select mobile, sum(credit) as sumCredit, time from CreditLog"
+ " where year(time) = ? and month(time) = ? and day(time) = ?"
+ " group by mobile order by sumCredit desc"; Query query = currentSession().createQuery(hql); query.setFirstResult(0);
query.setMaxResults(1); query.setParameter(0, year);
query.setParameter(1, month);
query.setParameter(2, day); List<Object[]> objsList = query.list();
Object[] firstObjs = objsList.get(0); return new CreditRank(1, (String)firstObjs[0], (Double)firstObjs[1]);
}

2. 求某一具体的mobile按总获益算得的名次

select rank from (select @counter:=@counter+1 as rank, mobile, sumCredit from (select mobile, sum(credit) as sumCredit from shake_log where time between '2014-12-06 00:00:00' and '2014-12-06 23:59:59' group by mobile order by sumCredit desc) as sumList, (select @counter:=0) as t) as rankList where mobile='';

这一部分没有转成hql, 因为hibernate不支持from子查询。

那就使用hibernate直接调用sql语句。

public CreditRank queryRank(String mobile, int year, int month, int day) {

        String sql = "select rank, mobile, sumCredit " +
"from (select @counter\\:=@counter+1 as rank, mobile, sumCredit " +
"from (select mobile, sum(credit) as sumCredit from shake_log " +
" where year(time) = :year and month(time) = :month and day(time) = :day " +
"group by mobile order by sumCredit desc) as sumList, (select @counter\\:=0) as t) as rankList " +
"where mobile = :mobile"; SQLQuery query = currentSession().createSQLQuery(sql)
.addScalar("rank", StandardBasicTypes.INTEGER)
.addScalar("mobile", StandardBasicTypes.STRING)
.addScalar("sumCredit", StandardBasicTypes.DOUBLE); // 设置参数
query.setParameter("year", year);
query.setParameter("month", month);
query.setParameter("day", day);
query.setParameter("mobile", mobile); // 查询
List<Object[]> objsList = query.list(); if (objsList.size() == 0) {
return null;
} Object[] firstObjs = objsList.get(0); // 封装
CreditRank creditRank = new CreditRank((Integer)firstObjs[0], (String)firstObjs[1], (Double)firstObjs[2]); return creditRank;
}

需要注意:

:= 要 \\:= 才能被识别

mysql 累加排序求名次的更多相关文章

  1. 【MySQL】排序原理与案例分析

    前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...

  2. POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)

    题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...

  3. mysql 自定义排序顺序

    mysql 自定义排序顺序 实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID ...

  4. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  5. MySql获取记录的名次

    在oracle中有rownum之类的东西表示记录的名次,那么在MySql中怎么获取名次呢? as rank ) B 获取的rank就是名次了 user_id rank 134762    122139 ...

  6. LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

    和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...

  7. MySQL分组排序(取第一或最后)

    MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...

  8. MySQL的排序(order by)

    MySQL的排序(order by) 1.降序(DESC) 2.升序(ASC) 1. 降序(DESC) 完整代码: SELECT `学号`,`考试日期`,`考试成绩` FROM `表2`ORDER B ...

  9. mysql order排序

    使用order by  可以对结果进行排序, 默认情况下,order by 以升序进行排序,因此ASC 子句是可选的. DESC 是降序排列. 升序 select * from emp where d ...

随机推荐

  1. RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)

    Kickstart服务器 IP: 192.168.136.253   掩码:255.255.255.0   网关:192.168.136.2   DNS:192.168.136.2 安装部署HTTP服 ...

  2. user.table.column, table.column 或列说明无效

    Oracle统计采用别名出错(user.table.column, table.column 或列说明无效) >>>>>>>>>>>& ...

  3. bootstrap 模态框关闭状态怎么获取

    比如现在有个场景,一个事件 需要在模态框关闭之后再执行自己的逻辑,先上图: 参考官网说明:http://v3.bootcss.com/javascript/#modals-events //每次关闭模 ...

  4. 3、bootstrap3.0 栅格偏移 布局中的一个特产

    理解了栅格化,那么栅格偏移也相对容易理解了.v3的偏移分别有以下几种: offset:左外边距(margin-left): pull:右位移(right): push:左位移(left). 其中off ...

  5. Struts2,Hibernate和Spring之间的框架整合关系

    1.首先要认清,hibernate和struts没有半点关系,所以他们之间没有任何可以整合的东西.a:struts 作为中心控制器,肯定要调用一些类来完成一些逻辑.而hibernate开发中,经常使用 ...

  6. Sql Xml

    /* sql xml 入门: --by jinjazz --http://blog.csdn.net/jinjazz 1.xml: 能认识元素.属性和值 2.xpath: 寻址语言,类似windows ...

  7. Oracle 11g 虚拟列 Virtual Column介绍

    Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: ...

  8. C# 之【获取网页】

    C#获取指定网页HTML原代码可使用 WebClient WebRequest HttpWebRequest 三种方式来实现. 当然也可使用webBrowse!在此就不研究webBrowse如何获取了 ...

  9. C#中检查网络是否连通的二种方法

    using System;  2 using System.Collections.Generic;  3 using System.Text;  4 //方法一  5 using System.Ru ...

  10. JavaScript 快速入门回顾

    数据类型Number JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123; // 整数123 0.456; // 浮点数0.456 1.2345e ...