Я хочу отображать сообщения с именем отправителя. Внешний цикл while работает нормально, но во внутреннем цикле есть некоторая проблема. Я много пробовал разобраться, но не получил результата. Может кто-нибудь мне помочь? Я очень благодарен.
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?
Ali Ahmed sent you a message: Hi!
Требуемый вывод
Ali Ahmed sent you a message: How are you?
Hamza sent you a message: Hi!
Проблема происходит от двух вложен в while
циклы.
Запрос ResultSet rs1 = st1.executeQuery("SELECT * FROM data");
выполняется только один раз.
При первом while(rs.next())
вы получите весь контент rs1
чтобы проверить, является ли идентификатор отправителя правильным.
Затем на второй итерации while(rs.next())
потому что rs1
уже извлечен, while(rs1.next())
wil возвращает false
.
Чтобы заставить ваш код работать, вы должны переместить выполнение второго запроса, чтобы получить что-то вроде этого:
while(rs.next()) {
...
ResultSet rs1 = st1.executeQuery("SELECT * FROM data");
while(rs1.next()) {
...
}
...
}
Но я думаю, что было бы лучшим решением сделать только один запрос SQL, соединяющий данные двух таблиц и включающий условие where.