自己做的一个小项目里需要用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. 第一篇:web之前端之html

    前端之html   前端之html 本节内容 前端概述 html结构 标签探秘 <!DOCTYPE html>标签 head标签 body标签 1.前端概述 一个web服务的组成分为前端和 ...

  2. css 导航条 布局

    导航条(简单易用的导航) <!DOCTYPE html> <html> <head> <style> ul { list-style-type:none ...

  3. [Mime] MediaTypes--电子邮件类型类 (转载)

    点击下载 MediaTypes.rar 这个类是关于 电子邮件类型类的操作,在发送电子邮件是规定以什么样的格式发送,Xml,HTML,文本等方式1.电子邮件类型帮助类,Xml格式,HTML格式等看下面 ...

  4. Angularjs总结(二)过滤器使用

    html页面: <table> <thead> <tr> <td class="td">序号</td> <td c ...

  5. Python:文件操作

    #!/usr/bin/python3 str1 = input("请输入:") print("你输入的是:",str1) f=open("abc.tx ...

  6. PHP程序开发人员要掌握的知识

    文件目录处理函数包80%以上的函数的功能的灵活运用. 日期时间函数中的80%以上的函数的功能的灵活运用 数学函数库中的100%的内容. 网络库中的60%以上的内容,对各个函数的功能比较熟悉. 字符串处 ...

  7. Best Time to Buy and Sell Stock III 解题思路

    题目要求: 最多交易两次,并且只能买卖完之后再买. 总思路: 在数组中找一个适当的点i,使得i左右两边profit之和最大. 思路: 1.从左往右扫描,left[i]记录包括i元素以内的左部的maxp ...

  8. iOS 异常汇总

    reason: 'invalid nib registered for identifier (cell) - nib must contain exactly one top level objec ...

  9. java 整体字体样式设置

    两种方式:   1.UIManager.put("Button.font", new Font("MS UI Gothic", Font.PLAIN, 24)) ...

  10. 受教了,memcache比较全面点的介绍,受益匪浅,适用memcached的业务场景有哪些?memcached的cache机制是怎样的?在设计应用时,可以通过Memcached缓存那些内容?

    基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...