2013-04-16 2 views
0

AIM 기반 : 내가 만들고 내 배열 목록에 값이 같은 SQL 쿼리를 같은 수 또는 시간을 실행하고 SQL에만들기 SQL 배열 목록에

배열 목록을 incoorperate하려고 :// 이것은 모든 팀 구성원 이름을 얻고 팀의 각 구성원에 대해 실행하는 배열 목록을

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(); 

I는 Al의 배열 및 그 루프의 일부 값을 반복하여 다른 배열 AL1에 그 쿼리의 결과를 추가 할 수있는 그 제 SQL하는 int Al의 배열의 값을 삽입 할 .

하나의 솔루션은 int 배열에 알 배열을 추가하고 내 루프를 생성하는 데 사용할 것이라고 생각하고 그 루프에 X 값을 통해 기본 증가 ++를 삽입 할 것입니다. 그러나 그것은 조금 혼란스러워 보입니다. 나는 잘 모르고있는 더 나은 해결책이 있다고 생각합니다.

도움이 될만한 의견을 보내주십시오.

건배. 당신이보기 를 사용하지 않는 이유

+0

첫 번째 s uggestion : 외래 데이터베이스를 사용하는 관계형 데이터베이스와 테이블 관계에 대해 더 많이 읽으면'name' 칼럼 대신에 키를 사용하는 데 많은 시간을 절약 할 수 있습니다. 두 번째 제안 : 단일 쿼리를 사용하여'JOIN' 문장을 사용하여 원하는 데이터를 얻을 수 있습니다.세 번째 제안 : ** String ** 연결로 매개 변수를 전달하지 말고 [PreparedStatement]를 사용하여 [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) 공격을 막으십시오. –

+0

그 제안은 Luiggi입니다. 내 SQL은 훌륭한 질문이 아니므로 JOIN 명령을 구조화하는 방법에 대한 정보는 더 필요합니까? – Rhys

+0

제공되는 답변에는 이에 대한 기본 예와 추가 제안 사항이 나와 있습니다. –

답변

0

먼저 제안 : foreign key를 사용하여 관계형 데이터베이스 및 테이블 관계에 대한 자세한 내용을, 당신은 많은 시간을 절약 할 수 name 열 대신 이러한 테이블을 조인 할 키가 있어야합니다.

두 번째 제안 : JOIN 문장을 사용하여 단일 쿼리를 사용하여 원하는 데이터를 얻을 수 있습니다.

세 번째 제안 : String 연결하여 결코 패스 매개 변수 대신 SQL Injection 공격을 방지하기 위해 PreparedStatement 사용합니다.

넷째 제안 : 평범한 ArrayList<String> 대신 List<SomeClass>을 검색하면 더 좋을 것입니다. 이는 programming to interfaces, not to implementation이고 SomeClass은 검색해야하는 속성을 보유 할 수 있기 때문입니다. 자바 측이 기본 쿼리를 사용

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 

가입하여

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)); 

자료 쿼리 :

MySQL의 구문 :이 모든 개념을 묶는

, 다음과 같이해야합니다

//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) {} 
} 
0

당신은 단지 하나 개의 쿼리를 두 테이블에서 뷰를 작성하고 실행할 수 있습니다

+0

안녕하세요. 익숙하지 않습니다. 그게 어떻게 끝날까요? – Rhys