0

AIM: 配列リストに値があるのと同じ回数または時間で SQL クエリを作成して実行し、それらを SQL に統合しようとしています。

Array List: //これにより、すべてのチーム メンバーの名前が取得され、それらが配列リストに追加されます

ResultSet rs = name.executeQuery("SELECT name from TEAM_MEMBERS");
            while (rs.next()) 
              { 
                 al.add(rs.getString("name"));
              } 
            rs.close();

チームの各メンバーに対して実行する SQL。チーム メンバーは変更されるため、これは静的ではありません。

ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = "+al+"");
            while (rs1.next()) 
              { 
                 al1.add(rs1.getString(1));
              } 
            rs1.close();

理想的には、al 配列の値をループし、そのループの一部として al 配列から値を挿入し、2 番目の sql に挿入して、それらのクエリの結果を別の配列 al1 に追加します。

1つの解決策は、al配列カウントをintに追加し、それを使用してループを生成し、基本的な増分++を使用してX値を介してループに値を挿入することだと思いました。しかし、それは少し厄介なようで、私が気付いていないより良い解決策があると考えています.

ヘルプの提案をいただければ幸いです。

乾杯。

4

2 に答える 2

0

ビューを使用しない理由両方のテーブルからビューを作成し、1 つのクエリのみを実行できます

于 2013-04-16T05:48:13.557 に答える
0

最初の提案: リレーショナル データベースと外部キーを使用したテーブル リレーションの詳細をお読みください。列の代わりにこれらのテーブルを結合するためのキーがあれば、多くの時間を節約できnameます。

2 番目の提案: 単一のクエリを使用して、JOIN文を使用して目的のデータを取得できます。

3 番目の提案:連結によってパラメーターを渡さないでください。代わりに a を使用して、 SQL インジェクション攻撃を防ぎます。StringPreparedStatement

List<SomeClass>4 番目の提案:プレーンではなく取得した方がよいでしょうArrayList<String>。これは、実装ではなくインターフェースに対してプログラミングしていてSomeClass、取得する必要がある属性を保持できるためです。

これらすべての概念を結び付けると、次のようになります。

MySQL 構文:

CREATE TABLE TEAM_MEMBERS
(id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL);

CREATE TABLE PROJECT_TIME
(id INT PRIMARY KEY AUTO_INCREMENT,
hours INT NOT NULL,
date DATE NOT NULL,
teamMemberId INT NOT NULL,
FOREIGN KEY (teamMemberId) REFERENCES TEAM_MEMBERS(id));

JOIN を使用したベース クエリ

SELECT tm.name, sum(pt.hours) AS hours -- retrieving both name and sum of hours at the same time
FROM
    TEAM_MEMBERS tm --team members table
    INNER JOIN PROJECT_TIME pt ON pt.teamMemberId = tm.id -- joining team members with project time table (not sure if this really makes sense, but is based on your code example)
WHERE
    DATE = <some_date> -- used to show where the parameter will go
GROUP BY
    tm.name -- used when using SUM or another AGGREGATE functions

Java 側でこの基本クエリを使用する:

//sample about the class
public class TeamMember {
    private String name;
    private int projectHours;
    //constructor...
    public TeamMember() {
    }
    //constructor sending parameters (because I'm lazy when having a class with few parameters)
    public TeamMember(String name, int projectHours) {
        this.name = name;
        this.projectHours = projectHours;
    }
    //getter and setters...
}

List<TeamMember> teamMembers = new ArrayList<TeamMember>();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
    con = ... //initialize the connection
    String query = "SELECT tm.name, sum(pt.hours) AS hours FROM TEAM_MEMBERS tm " +
        "INNER JOIN PROJECT_TIME pt ON pt.teamMemberId = tm.id " +
        "WHERE DATE = ? GROUP BY tm.name";
    pstmt = con.prepareStatement(query);
    pstmt.setString(1, date); //assuming you have your date in String format
    //pstmt.setDate(1, date); //you could use this if your date variable is java.util.Date
    rs = pstmt.execute();
    while(rs.next()) {
        teamMembers.add(new TeamMember(rs.getString("name"), rs.getInt("hours"));
    }
} catch (Exception e) {
    //handle the Exception
} finally {
    //close the resources (this is a MUST DO)...
    try {
        if (rs != null) {
            rs.close();
        }
    } catch (SQLException sqle) {}
    try {
        if (pstmt != null) {
            pstmt.close();
        }
    } catch (SQLException sqle) {}
    try {
        if (con != null) {
            con.close();
        }
    } catch (SQLException sqle) {}
}
于 2013-04-16T06:10:23.527 に答える