基本上我有一个玩家列表:
final List<String> members = getClanMembers(clan);
每个玩家都有 KILLS 。
我想总结一下并获得所有玩家的 TOTAL KILLS 。
这就是我现在正在做的事情:
Integer kills = 0;
for (final String plr : members) {
try {
final PreparedStatement sel = conn.prepareStatement("SELECT kills FROM Stats WHERE player=?");
sel.setString(1, plr);
final ResultSet rs = sel.executeQuery();
kills += rs.getRow() != 0 ? rs.getInt("kills") : 0;
} catch (final SQLException e) {
e.printStackTrace();
}
}
但是,我认为这段代码效率不高,我知道你可以在MySQL中创建变量来做得更好。 (不好的东西:尝试在for循环中捕获,一次执行太多查询)
有人可以给我一些提示吗?
提前致谢。
编辑:我忘了提及我只想总结阵列中玩家的杀戮,而不是表中的所有玩家。
答案 0 :(得分:1)
是的,您可以使用MySQL在
的单行和列中执行整个SUM()SELECT SUM(kills) FROM Stats
然后rs.getInt(1)
将返回所有玩家的总数。
修改强>
将members
列表转换为逗号分隔的player_ids列表,并添加&#34; WHERE播放器IN&#34;上面的查询的子句,你只能获得那些球员的总数。
答案 1 :(得分:1)
将SUM()
函数与WHERE player IN ...
子句一起使用,该子句将求和仅限于指定族中的那些记录。
SELECT SUM(kills) FROM Stats WHERE player IN (?, ?, ?)
注意:您需要插入正确数量的'?'对于阵列中的玩家数量,然后将这些参数设置为阵列中的玩家名称。
Integer kills = 0;
if(members.size() > 0) {
StringBuilder sql = new StringBuilder("SELECT SUM(kills) FROM Stats WHERE player in (?");
for(int index = 1; index < members.size(); index++) {
sql.append(",?");
}
sql.append(")");
try {
final PreparedStatement sel = conn.prepareStatement(sql.toString());
for (int index = 0; index < members.size(); index++) {
sel.setString(index + 1, members.get(index));
}
final ResultSet rs = sel.executeQuery();
kills = rs.getRow() != 0 ? rs.getInt(1) : 0;
} catch (final SQLException e) {
e.printStackTrace();
}
}