总结玩家名单的杀戮

时间:2014-06-12 03:05:18

标签: java mysql sql

基本上我有一个玩家列表:

    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循环中捕获,一次执行太多查询)

有人可以给我一些提示吗?

提前致谢。

编辑:我忘了提及我只想总结阵列中玩家的杀戮,而不是表中的所有玩家。

2 个答案:

答案 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();
    }
}