2017-12-20 15 views
0

보낸 사람 이름이있는 메시지를 표시하려고합니다. 외부 while 루프는 잘 작동하지만 내부 while 루프에는 약간의 문제가 있습니다. 알아 내려고 노력했지만 결과가 없습니다. 누구든지 나를 도울 수 있습니까? 나는 매우 감사 할 것이다.java mysql에서 두 테이블의 데이터 표시

package db; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.Scanner; 

public class Messages extends Login { 
    static Scanner in = new Scanner(System.in); 

public static void main(String args[]) throws Exception{ 
    boolean isLoggedin = login(); 

    String msg = ""; 
    String senName = ""; 

    if(isLoggedin) { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?verifyServerCertificate=false&useSSL=false", "root", ""); 
     Statement st = con.createStatement(); 
     Statement st1 = con.createStatement(); 
     ResultSet rs = st.executeQuery("SELECT * FROM chat"); 
     ResultSet rs1 = st1.executeQuery("SELECT * FROM data"); 
     while(rs.next()) { 
      int dbRecID = rs.getInt("reciever_id"); 
      if(dbRecID == user_id) { 
       msg = rs.getString("message"); 
       int dbSenID = rs.getInt("sender_id"); 
       while(rs1.next()) { 
        int senID = rs1.getInt("id"); 
        if(senID == dbSenID) { 
         senName = rs1.getString("name"); 
        } 
       } 
       System.out.println(senName+" sent you a message: "+msg); 
      } 
     } 

    } 
    else { 
     System.out.print("Login Unsuccessful"); 
    } 
} 
} 

출력

Ali Ahmed sent you a message: How are you? 
Hamza sent you a message: Hi! 
+0

출력이 "필수 출력"이어야한다고 생각하는 이유를 설명하십시오 – isaace

+0

데이터베이스에는 두 개의 메시지가 있기 때문에 설명하십시오. 하나는 알리 아메드가 보내고 다른 하나는 함자가 보낸다. 프로그램이 모든 메시지를 완벽하게 인쇄하지만 보낸 사람 이름을 업데이트하지 않습니다. –

답변

1

문제는 두 개의 중첩 while 루프에서 오는

Ali Ahmed sent you a message: How are you? 
Ali Ahmed sent you a message: Hi! 

필수 출력.

쿼리 ResultSet rs1 = st1.executeQuery("SELECT * FROM data");은 한 번만 실행됩니다.

처음으로 while(rs.next())에 루프하면 rs1의 전체 내용을 가져 와서 보낸 사람 ID가 올바른지 확인합니다.

그런 다음 rs1이 이미 가져 오기되었으므로 while(rs.next())의 두 번째 반복에서 while(rs1.next())이 반환됩니다. false입니다.

이 같은 얻을 수있는 두 번째 쿼리의 실행을 이동해야 작동 코드를 갖기 위해 :

while(rs.next()) { 
    ... 
    ResultSet rs1 = st1.executeQuery("SELECT * FROM data"); 
    while(rs1.next()) { 
     ... 
    } 
    ... 
} 

을하지만 난 그냥 하나 개의 SQL을 만들기 위해 더 나은 솔루션이 될 것이라고 생각 두 테이블의 데이터를 조인하고 where 조건을 포함하는 요청.

+0

안녕하세요 Nirekin, 도와 주셔서 대단히 감사합니다! 이 방법은 저에게 효과적이었습니다. 다시 한 번 감사드립니다! :) –

+0

좋아,하지만 조인을 사용하여 고유 한 SQL 요청을 고려하십시오 ... – Nirekin