从First SQL Query获取结果,以便在第一个SQL查询中使用它

时间:2017-11-19 17:50:42

标签: java sql

如何使这个工作?显然,我不了解Java中其他SQL查询中的SQL查询的一些非常基本的工作人员,但搜索并没有帮助!

提前谢谢

        try (Connection con = L2DatabaseFactory.getInstance().getConnection())
        {
            PreparedStatement stm = con.prepareStatement("SELECT count,owner_id FROM items WHERE item_id=57 order by count desc limit 10");
            ResultSet rSet = stm.executeQuery();
            while (rSet.next())
            {
                int owner_id = rSet.getInt("owner_id");
                int count = rSet.getInt("count");
                if (count == 0)
                {
                    continue;
                }
                PreparedStatement stm1 = con.prepareStatement("SELECT char_name,accesslevel,online FROM characters WHERE obj_Id=" + owner_id);
                ResultSet rSet1 = stm1.executeQuery();
                while (rSet1.next())
                {
                    int accessLevel = rSet.getInt("accesslevel");
                    if (accessLevel > 0)
                    {
                        continue;
                    }
                    String pl = rSet.getString("char_name");
                    int online = rSet.getInt("online");
                    String status = online == 1 ? "<font color=\"00FF00\">Online</font>" : "<font color=\"FF0000\">Offline</font>";                     
                    sb.append("<tr><td>"+ pl +"</td><td>"+ count +"</td><td>"+ status +"</td></tr>");
                }
            }
        }
        catch (Exception e)
        {
            _log.log(Level.SEVERE, "Error", e);
        }

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试使用Java代码连接两个表。这不是一个好主意,也不利于表现。让数据库为你做联接 - 它是专家。不要在Java中编写“inner joins”代码。

除此之外:准备好的陈述不会被关闭,这迟早会导致操作系统资源出现问题。

我的建议是使用inner joinselect in语句创建一个查询,并使用try with resources关闭所有准备好的语句。这些方面的东西:

private String test() throws SQLException {
    StringBuilder sb = new StringBuilder();
    int count = 0;
    try (Connection con = L2DatabaseFactory.getInstance().getConnection()) {
        try (PreparedStatement stm1 = con.prepareStatement(
                "SELECT char_name,accesslevel,online FROM characters WHERE obj_Id in (SELECT owner_id FROM items WHERE item_id=57 order by count desc limit 10)")) {
            ResultSet rSet = stm1.executeQuery();
            while (rSet.next()) {
                count++;
                int accessLevel = rSet.getInt("accesslevel");
                if (accessLevel > 0) {
                    continue;
                }
                String pl = rSet.getString("char_name");
                int online = rSet.getInt("online");
                String status = online == 1 ? "<font color=\"00FF00\">Online</font>" : "<font color=\"FF0000\">Offline</font>";
                sb.append("<tr><td>" + pl + "</td><td>" + count + "</td><td>" + status + "</td></tr>");
            }
        }
    } catch (Exception e) {
        Logger.getLogger("test").log(Level.SEVERE, "Error", e);
    }
    return sb.toString();
}