2 a13615323102 a13615323102 于 2016.09.13 17:57 提问

数据库大神和算法大神帮忙解决一个分页问题

有两个表,一个缴费表,一个欠费表,两个表对应一个账单类进行展示。
账单类

public class bill {
    private Strng userId;

    private Short rechargeAmount;

    private Short arrearageAmount;

    private String date;

    //get和set方法省略.....
} 

缴费表

 create table recharge
 (
        user_id varchar,/用户
        amount varchar,/*缴费金额
        opt_date timestamp/*操作时间
 )

欠费表

  create table arrearage
 (
        user_id varchar,/用户
        amount varchar,/*欠费金额
        opt_date timestamp/*操作时间
 )

用分布式的数据库储存,两个表是分库储存,所以无法关联查询。要对两个表进行汇总查询并且分页,页码是pageNum,页数是pageSize。两个表独立且关联的,可以同一用户同一操作时间既有缴费记录又有欠费记录,也可以单独有单表记录(rechargeAmount或arrearageAmount记0),然后汇总到bill类后展示。
现在要根据多用户(user_id in (?,?……?,?))和操作时间(opt_date >= ?and opt_date <= ? )进行查询,按操作时间排序(order by opt_date),该如何查询?
ps:(selet … from rechage … ) union或union all )select … from arrearage …) 这样遍历两个表所有的数据进行汇总然后分页是不行的,数据量太大,数据库会超时挂掉。

3个回答

xyzhanhh
xyzhanhh   2016.09.18 16:52

你先别汇总查询,先查到用户集合 List(最好是分页查询用户,因为每个用户应该都有缴费金额和欠费金额,
没有页面上缴费和欠费显示空白也对,免得后面还要分页), 然后for循环用户集合,取出每个用户的id,
然后根据用户id查询用户缴费金额与欠费金额。
List billList = 获取到用户集合方法;
List bills = new ArrayList();

Bill newBill = null;
for(Bill bill : billList){
String userId = bill.getUserId();
//根据用户id查询用户缴费金额
Strig recharge = 获取到用户缴费金额方法;
//根据用户id查询用户欠费金额
Strig arrearage = 获取到用户欠费金额方法;
newBill = new Bill();
newBill.setUserId(userId);
newBill.setRechargeAmount(recharge);
newBill.setArrearageAmount(arrearage);
bills.add(newBill);
}
这只是获取数据集合的方法,分页你可以使用你们项目里面的分页。

yenange
yenange   2016.09.28 15:40

应该每天凌晨运行一次, 得到所有的结果放在一个报表库, 分页直接取报表库的内容就好。

a13615323102
a13615323102 嗯,效率提高很多,union all的效率比 or 和 in的效率都要高
大约一年之前 回复
yenange
yenange 回复Dylan_Chris: 然后就能快起来了?
大约一年之前 回复
a13615323102
a13615323102 回复yenange: 尴尬啊,随后还是用的union all, 把in(...,...,..)拆成了N个union all语句。。。。
大约一年之前 回复
yenange
yenange 回复Dylan_Chris: 表小还好说, 表大根本不能这么玩。 想办法把B库的表传到另A库作为副本, 在同一服务器效率才高。此外, 也可以把表分成当前表和历史表。 按你原来的, 玩不转的了
大约一年之前 回复
a13615323102
a13615323102 这两个table不是为报表提供的,而是实时更新、实时查询的。并不能定时汇总到一个table里哎
大约一年之前 回复
qq_29594393
qq_29594393   Ds   Rxr 2016.09.13 18:40

这和算法有半毛钱关系?就是数据库设计而已

qq_29594393
qq_29594393 回复a13615323102: 一般先标明涉及的领域,像这个就是分布式数据库查询处理,说明问题,分布式数据库两表相关联要连接查询,但是长时间连接会挂掉,等
大约一年之前 回复
a13615323102
a13615323102 那我应该怎么问呢?
大约一年之前 回复
qq_29594393
qq_29594393 回复a13615323102: 问题的重点是这不是算法,是数据库相关知识,.....所以没人回
大约一年之前 回复
a13615323102
a13615323102 数据库已经设计完了,并不是我能改动的
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片