【问题标题】:Obtaining a count of data from one SQL table with a relationship to another and using this in java从一个与另一个有关系的 SQL 表中获取数据计数并在 java 中使用它
【发布时间】:2016-01-03 17:52:08
【问题描述】:

我的程序有 2 个数据库表:GameInfo 和 Characters。 其工作原理是一个游戏有 4 张不同名称的地图,并且必须为添加到游戏中的每个角色分配 4 张地图中的任何一张。现在我有一个 sql 语句,它返回一个名为“Expr1001,每个地图上的字符数的结果集。然后我需要将此信息添加到 jTable 并将地图上每个字符的相应数量与地图名称链接起来。

我的 ResultSet 带有返回每个地图上字符数量的查询:

ResultSet qs = dbm.queryDatabase("SELECT Expr1001 FROM (SELECT GameInfo.mapname, SUM(IIF(Map = GameInfo.mapname,1,0)) FROM (SELECT * FROM [Character] INNER JOIN Player ON Character.PlayerID=Player.[ID])  AS A RIGHT JOIN GameInfo ON A.Character.map = GameInfo.mapname GROUP BY GameInfo.mapname)  AS [%$##@_Alias]");

从 GameInfo 表中从数据库中获取游戏信息的整个方法,它仅包含一个 GameID 和 MapName。

 public Game[] getGameInfo(){
       Game[] arr = null; //Creates an array of Games


    try { //getting list from database
        ResultSet rs = dbm.queryDatabase("Select Count(GameID) as NumGames from GameInfo" );
        //While there are still more rows to read from the database.
        rs.next();
        int count = rs.getInt("NumGames");
        arr = new Game[count];
        String sql = "Select * from GameInfo";
       // System.out.println(sql);

        rs = dbm.queryDatabase(sql);
        //Take the info from the current row
        //Add the info to the array
         ResultSet qs = dbm.queryDatabase("SELECT Expr1001 FROM (SELECT GameInfo.mapname, SUM(IIF(Map = GameInfo.mapname,1,0)) FROM (SELECT * FROM [Character] INNER JOIN Player ON Character.PlayerID=Player.[ID])  AS A RIGHT JOIN GameInfo ON A.Character.map = GameInfo.mapname GROUP BY GameInfo.mapname)  AS [%$##@_Alias]");
        for(int i = 0; rs.next(); i++){

            arr[i] = new Game(
                    rs.getInt("GameInfo.GameID"), 
                    rs.getString("GameInfo.mapname"), 
                 qs.getInt(i));
        }//Creates a Game from the currently selected info


    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Failed to get Games");
        e.printStackTrace();
    }
    return arr;
}

}

然后将数据添加到 GameInfoPanel 类中 Panel 上的 jTable 中:

 public void refreshTable() {
    //remove old stuff
    refreshing = true;

    Game[] arr = gim.getGameInfo();
    DefaultTableModel model = (DefaultTableModel) GameInfoTable.getModel();
    while (model.getRowCount() > 0) {
        model.removeRow(0);

    }
    for (int i = 0; i < arr.length; i++) {
        model.addRow(new Object[]{
            arr[i].getNumberOfCharacters(),
           arr[i].getID(),
            arr[i].getMapName()});
    }
    refreshing = false;

    //load new data from database using manager
}

当我尝试运行程序时,我不断收到指向 ResultSet qs 行的错误:“用户缺少权限或找不到对象:A.CHARACTER.MAP”,即使我将此语句复制到 Microsoft Access 并运行没关系。

请帮忙! 谢谢。

(我还在上学,所以在这方面根本不是天才,所以如果我做了一些愚蠢的事情,请原谅)

【问题讨论】:

  • 尝试用CHARACTER.MAP替换A.CHARACTER.MAP
  • @AdamMartin 错误现在是:用户缺少权限或找不到对象:CHARACTER.MAP

标签: java mysql sql


【解决方案1】:

不要先运行select count(*) 来获取分配数组的游戏数。构建你的结果是一个List,它会根据需要自动扩展。如果需要,您可以随时将列表转换为数组。

当一个查询可以完成时,不要运行两个查询,尤其是当您已经加入相关表时。

你的 SQL 不可读,所以这里的格式更易读:

String sql = "SELECT Expr1001" +
              " FROM (SELECT GameInfo.mapname" +
                          ", SUM(IIF(Map = GameInfo.mapname,1,0))" +
                      " FROM (SELECT *" +
                              " FROM [Character]" +
                             " INNER JOIN Player ON Character.PlayerID=Player.[ID]" +
                            ")  AS A" +
                     " RIGHT JOIN GameInfo ON A.Character.map = GameInfo.mapname" +
                     " GROUP BY GameInfo.mapname" +
                    ")  AS [%$##@_Alias]";

外部查询什么也不做。摆脱它。
不要SELECT *。选择您想要的列,即Character.map
既然您想要GameID,请将其添加到GROUP BY
SUM 值指定别名。

public Game[] getGameInfo(){
    String sql = " SELECT GameInfo.GameID" +
                       ", GameInfo.mapname" +
                       ", SUM(IIF(C.map = GameInfo.mapname,1,0)) AS CharacterCount" +
                   " FROM ( SELECT Character.map" +
                            " FROM [Character]" +
                            " JOIN Player ON Player.[ID] = Character.PlayerID" +
                         ") C" +
                  " RIGHT JOIN GameInfo ON GameInfo.mapname = C.map" +
                  " GROUP BY GameInfo.GameID" +
                          ", GameInfo.mapname";
    try (ResultSet rs = dbm.queryDatabase(sql)) {
        List<Game> games = new ArrayList<>();
        while (rs.next())
            games.add(new Game(rs.getInt("GameID"),
                               rs.getString("mapname"),
                               rs.getInt("CharacterCount")));
        return games.toArray(new Game[games.size()]);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Failed to get Games");
        e.printStackTrace();
        return null;
    }
}

【讨论】:

  • 感谢您的帮助!但是,Netbeans 指定“类型 List 不带参数”。有这方面的信息吗?
  • 我认为您输入了错误的Listjava.util.List.
  • 是的,我做到了...非常感谢您的帮助。我真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多