代价总是会有的,不是开发快就是效率低。如果你在收到类似于这类任务
本页显示所有等级段内的人数
|
等级
|
h府
|
g房
|
f场
|
e场
|
d场
|
c营
|
b营
|
a营
|
i馆
|
j院
|
k仓
|
l仓
|
m集
|
1-10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10-20
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20-30
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30-40
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
至100
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表结构:
{
id
level
buildid (建筑类型)
uid
}
在我想到这个点子的时候不是为了解决上面这个查询,而是为了解决一堆这样的查询。
本来是以为用一些表达式来做,但是实际上我发现按照如下的方法更直观,没有任何学习成本。
如果你发现结果和你预想的不同。那么久断点下,看看生成的sql是否是正确的。这里有一个拼接sql字符串的东西。
当你还在想破脑筋为了这些无聊的东西发愁的时候,有这么一小段代码帮你偷工减料。
1、构造一个Result对象
public class Result {
public List<String[]> select = new ArrayList<String[]>();
public List<String> where = new ArrayList<String>();
public List<String[]> group = new ArrayList<String[]>();
public List<String> order = new ArrayList<String>();
}
2、Result result = new Result();
result.select.add(new String[] { "府",
"select count(*) from Building where buildid = 4 and ?" });
result.select.add(new String[] { "房",
"select count(*) from Building where buildid = 10 and ?" });
result.select.add(new String[] { "场",
"select count(*) from Building where buildid = 1 and ?" });
result.select.add(new String[] { "场",
"select count(*) from Building where buildid = 2 and ?" });
result.select.add(new String[] { "场",
"select count(*) from Building where buildid = 3 and ?" });
result.select.add(new String[] { " 兵",
"select count(*) from Building where buildid = 5 and ?" });
result.select.add(new String[] { "兵",
"select count(*) from Building where buildid = 6 and ?" });
result.select.add(new String[] { "兵",
"select count(*) from Building where buildid = 7 and ?" });
result.select.add(new String[] { "馆",
"select count(*) from Building where buildid = 12 and ?" });
result.select.add(new String[] { "院",
"select count(*) from Building where buildid = 11 and ?" });
result.select.add(new String[] { "仓",
"select count(*) from Building where buildid = 8 and ?" });
result.select.add(new String[] { "仓",
"select count(*) from Building where buildid = 9 and ?" });
result.select.add(new String[] { "集",
"select count(*) from Building where buildid = 13 and ?" });
result.group.add(new String[] { "1", "level >=1 and level < 10" });
result.group.add(new String[] { "2", "level >=10 and level < 20" });
result.group.add(new String[] { "3", "level >=20 and level < 30" });
result.group.add(new String[] { "4", "level >=30 and level < 40" });
result.group.add(new String[] { "5", "level >=40 and level < 50" });
result.group.add(new String[] { "6", "level >=50 and level < 60" });
result.group.add(new String[] { "7", "level >=60 and level < 70" });
result.group.add(new String[] { "8", "level >=70 and level < 80" });
result.group.add(new String[] { "9", "level >=80 and level < 90" });
result.group.add(new String[] { "10", "level >=90 and level < 100" });
List<User> users = playerMng.findByHql("from User where name = '"
+ userName + "'");
if (users.size() != 0) {
result.where.add("userId = " + users.get(0).getUid());
}
3、select!
public List parserHQL(Result result) {
List list = new ArrayList();
for (String[] garr : result.group) {
// Map map = new HashMap();
Object[] arr = new Object[result.select.size() + 1];
int i = 1;
arr[0] = garr[0];
for (String[] sarr : result.select) {
Object obj = null;
String sql = sarr[1].replace("?", garr[1]);
String groupSql = "";
if (sql.indexOf("#") != -1) {
groupSql = sql.split("#")[1];
sql = sql.split("#")[0];
}
for (String where : result.where) {
sql += " and " + where;
}
sql += groupSql;
List l = dao.findByHql(sql);
if (l != null && l.size() > 0) {
obj = l.get(0);
}
// map.put(sarr[0], obj);
arr[i] = obj;
i++;
}
list.add(arr);
}
return list;
}
构造Result 对象的时候别看字多,逻辑非常简单。不用去想什么sql怎么写。
groop list保存的是Y轴条件,
where list 保存的是总条件。如查询uid为xxx的 这个报表
select list 保存的是显示内容和查询sql(主)
数组第0个元素为显示内容,第一个元素为sql的条件。 这个条件会替换掉X轴sql里面的 ?
如果X轴是带GROUP的sql 并且还有总条件那么需要用#代替。
如果想order一下,这个功能还没加。不过也就是根据最终的list 排序而已。
如果想分页?我觉得这类查询不需要分页。
如果想优化性能?当然可以,毫无疑问虽然写了那么多。实际上一个结果集中大概80%的查询内容是可以从同一个sql结果集中取出结果。每合并一个查询结果会减少Y轴数量 个查询 ~
------------
这里只是抛砖引玉,只适合存在Y轴条件的查询。如果你优化的足够好,就像上面说的那样合并查询内容。实际上和你去捣鼓sql的效果一样。一般是不需要分页的,排序更不是问题。
原理就是 Y轴条件+X轴条件 一定是单一值,然后写个程序循环下 再把结果拼起来。
---再贴几个实现。
本页显示对应等级的数量,以及拥有对应等级的人数
|
等级
|
数量
|
人数
|
一级
|
|
|
二级
|
|
|
三级
|
|
|
四级
|
|
|
五级
|
|
|
六级
|
|
|
七级
|
|
|
八级
|
|
|
九级
|
|
|
Result result = new Result();
result.select.add(new String[] { "数量",
"select count(*) from t_treasure where ?" });
result.select.add(new String[] { "人数",
"select count(*) from (select count(*) from t_treasure where ? # group by user_Id) a" });
result.group.add(new String[] { "一级", "strong_Level = 1" });
result.group.add(new String[] { "二级", "strong_Level = 2" });
result.group.add(new String[] { "三级", "strong_Level = 3" });
result.group.add(new String[] { "四级", "strong_Level = 4" });
result.group.add(new String[] { "五级", "strong_Level = 5" });
result.group.add(new String[] { "六级", "strong_Level = 6" });
result.group.add(new String[] { "七级", "strong_Level = 7" });
result.group.add(new String[] { "八级", "strong_Level = 8" });
result.group.add(new String[] { "九级", "strong_Level = 9" });
----------
再更新一个。。。这个本来不想用这种方法的。。但是突然开始头痛。。。分页方式示例。让分页、排序也成浮云。
Result result = new Result();
result.select
.add(new String[] { "金额",
"select sum(num)/10 from t_gold_record where type = '53' and ?" });
result.select
.add(new String[] { "总数",
"select sum(num)/10 from t_gold_record where type in('47','58','59') and ?" });
result.select
.add(new String[] {
"未消耗数",
"select sum(num)/10 from t_gold_record where type not in('47','58','59','53') and ?" });
Pagination pagination2 = mallMng
.findBySql(
"select date_format(record_time, '%Y-%m') from t_gold_record group by date_format(record_time, '%Y-%m') desc",
pageNo, getCookieCount());
for (Object obj : pagination2.getList()) {
result.group.add(new String[] { obj.toString(),
"date_format(record_time, '%Y-%m') = '" + obj + "'" });
}
List list = mallMng.parserSQL(result);
vf
表结构
{
id
type
num
uid
record_time
}
这次呢,没有Y轴了,表面上看起来没有Y轴 实际上Y轴大家心里都知道了。就是record_time 的月份 Y轴由一段查询结果构成,因为这段结果是分页的,相当于整个报表也是分页的!同时Y轴排序=对整个报表排序。
分享到:
相关推荐
- **简单的逆向分析**:对于初学者而言,建议从简单的程序开始逆向分析,逐步过渡到复杂的应用程序。这种从易到难的学习路径有助于建立信心和技术积累。 - **常见静态分析手法** - **信息收集**:通过对APK文件的...
【娱乐资本论】2024互动影游发展报告-《完蛋》开启新纪元.pdf【娱乐资本论】2024互动影游发展报告-《完蛋》开启新纪元.pdf【娱乐资本论】2024互动影游发展报告-《完蛋》开启新纪元.pdf【娱乐资本论】2024互动影游...
Android逆向菜鸟速参手册完蛋版_52pojie.pdf 作者允许传播
Android逆向菜鸟速参手册完蛋版_52pojie.pdf 由于大于60MB所以分为2个压缩文件
Android逆向菜鸟速参手册完蛋版
WINDOWS SERVER 2008 硬盘安装以及备份方法 .Windows Server 2008 硬盘安装方法详解 在安装 Windows Server 2008 之前,需要准备以下工具: 1. WINPE 用 U 盘来制作,作为安装前的准备环境,U 盘大小最好在 ...
改MBR的病毒,一运行输密码,对了解除,不对改MBR,改成好几段文字,C++写的,请在XP系统以上运行(不包括XP)
互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新...
通过穷举的方法恢复某个用户曾经发布的所有微博配图,在新浪公司完蛋之前应该能找到,大约10年吧。。。每次都要修改右上角那个字符串,改成你自己发的微博配图的文件名前几位(位数同默认数值的位数) 没事闲的就给...
互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网...
让火车在地图上有一个方向 站点时间的鼠标悬停 修复地图文本间距 找出加载绿线时 Firefox 崩溃的原因(可能是绿线的错,该死的 MBTA) 写一篇关于 React/Immutable/es6 有多棒的版权页 发布到 howfuckedisthet.com ...
今天系统重装了,就很完蛋。所有东西都重新下载安装。向Navicat导入sql的时候导入失败: 报错[Err] 1046 – No database selected。我很疑惑地又导了几次。当然又全都失败. 错误造成原因: 直接在连接位置上...
其实我们做运营也无非就是三件事,拉新、留存、促活,但也就是这三件事却也难道了万千的运营狗们,那么究竟怎样做才能更快速更高质量的完成这三项任务呢?在运营的过程中什么才是最重要的呢?也许好多人会说,做广告、...
今天遇到了一个很棘手的问题,就是在做一些输入框的验证的时候,我这边项目的业务逻辑就是当我选中某个select的某个特定option的时候,需要显示出一个input输入框让用户输入东西,但是如果用户啥也不做,就必须弹出...
手机关机充电连接QPST就可以随便删除文件 注:乱删等于手机完蛋 添加图片目录:在brew/mod/目录下新建目录10888,B309只支持png格式,大小为128*128,拷贝可用拖拽的方法,没有复制右键菜单。完成后在手机菜单-...
安装升级部分介绍了四种安装方法:yum、tar、rpm、Cloudera Manager,并且强调了Cloudera Distribution Including Apache Hadoop(CDH)的优势,如安装升级更简单、更快获取新功能和修正新bug、年度release、季度...
基于go语言,beego框架,专注流量与时间要求beego 1.7+ cuu radius libs go get -u github.com/cuu/radius 管理员LTE 重新思考gorethink v3执照MPL 2.0安装去获取github.com/astaxie/beego 去获取-u github....