【发布时间】: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。当然,问题仍然存在:为什么不执行 SQLJOIN?这就是他们的目的。 -
let's say i have 2 queries...请向我们展示查询。 -
@TimBiegeleisen 我已经更新了脚本.. 请检查一下
-
这些是大型不同的查询,因此单独运行它们可能是有意义的。