Java SQL迭代2 ResultSet并合并它们

时间:2017-04-28 05:01:09

标签: java mysql sql resultset

假设我有2个查询和2个ResultSet。第一个是成员表查询,第二个查询是其他成员数据。现在我想加入第一个结果集和第二个结果集。例如,它看起来像这样

ResultSet rsMember = psMembers.executeQuery();
ResultSet rsCustomValues = psCustomValues.executeQuery();

// object for mapping query results
MembersMapper memberMapper = new MembersMapper();

while (rsMember.next()) {
   memberMapper.setId(rsMember.getString("id"));
   memberMapper.setName(rsMember.getString("name"));
   memberMapper.setUsername(rsMember.getString("username"));
   memberMapper.setGroup(rsMember.getString("group_id"));

   List strCustomValues = new ArrayList<>();
   while(rsCustomValues.next()){
      // map the custom values
      Map<String, Object> mapTemp = new HashMap<String, Object>();
      mapTemp.put(FIELD_ID, rsCustomValues.getString("custom_field_id"));
      mapTemp.put(INTERNAL_NAME,
      rsCustomValues.getString("custom_field_internalname"));
      mapTemp.put(NAME,rsCustomValues.getString("custom_field_name"));

      strCustomValues.add(mapTemp);
   }  
   memberMapper.setCustomvalues(strCustomValues);
}

问题是第二个(内在时)查询。连接第一个和第二个结果集之间的数据的是成员id,它是第一个表(第一个查询)中的主键和第二个查询中的外键。所以第二个查询将以随机顺序具有成员标识。

那么如何订购第二个查询而不必在第二个查询中添加'order by member_id'?我将不得不避免'由member_id订购',因为它需要时间来处理。

编辑:这是脚本

第一个脚本

select 
mbr.*, usr.username, grp.name as groupname, grp.status 
from members mbr 
join users usr on mbr.id = usr.id 
join groups grp on mbr.group_id = grp.id 
where mbr.id > #id# 
order by id asc 
limit #limit#

第二个脚本

    select 
    cfv.member_id as 'member_id', cf.id as 'custom_field_id', 
    cf.internal_name as 'custom_field_internalname', 
    cf.name as 'custom_field_name', cfv.string_value as 'cfv_stringvalue',
    cfv.possible_value_id as 'cf_possiblevalueid', cfvp.value as 'cfvpvalue' 
    from custom_field_values cfv 
    join custom_fields cf on cf.id = cfv.field_id 
    left join custom_field_possible_values cfvp on cfv.possible_value_id = cfvp.id 
    where exists(
    select * from (select id from members where id > #id# 
limit #limit# 
) result where result.id = cfv.member_id) 
    and cf.subclass = #subclass# 
    order by cfv.member_id asc

1 个答案:

答案 0 :(得分:1)

最好将第二个结果集提取到对象表示并对其进行排序。

在此处查看类似问题How can I sort ResultSet in java?