【问题标题】:Java SQL Iterating 2 ResultSet and merging themJava SQL 迭代 2 ResultSet 并合并它们
【发布时间】:2017-09-26 02:31:22
【问题描述】:

假设我有 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);
}

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

那么我怎样才能订购第二个查询,而不必在第二个查询中输入“按 member_id 排序”?我将不得不避免“按会员 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

【问题讨论】:

  • 您可以通过对结果进行排序来排序第二个查询,或者使用ORDER BY 子句询问数据库,或者将所有数据加载到内存中并在那里排序.无论哪种方式,数据都会被排序,这需要时间。唯一的区别是该时间是由应用程序服务器还是数据库服务器完成的,而数据库服务器可能做得更好,所以:使用ORDER BY当然,问题仍然存在:为什么不执行 SQL JOIN?这就是他们的目的。
  • let's say i have 2 queries ...请向我们展示查询。
  • @TimBiegeleisen 我已经更新了脚本.. 请检查一下
  • 这些是大型不同的查询,因此单独运行它们可能是有意义的。

标签: java mysql sql resultset


【解决方案1】:

最好将第二个结果集取到一个对象表示并整理出来。

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

【讨论】:

  • 哪个更快?使用 order by 在 db 中排序还是在我的 java 代码中排序?
  • 我认为最好使用 order by 进行排序,因为数据库会处理这个问题。大多数情况下,它会产生更好的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2018-10-25
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多