【问题标题】:Displaying data from two tables in java mysql在java mysql中显示来自两个表的数据
【发布时间】:2017-12-20 14:29:21
【问题描述】:

我想显示带有发件人姓名的邮件。外部 while 循环工作正常,但内部 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!

【问题讨论】:

  • 请解释为什么您认为输出应该类似于“必需输出”
  • 因为数据库中有两条消息。一份由 Ali Ahmed 发送,另一份由 Hamza 发送。该程序正在完美地打印所有消息,但它没有更新发件人姓名。

标签: java mysql database jdbc


【解决方案1】:

问题来自两个嵌套的while 循环。

查询ResultSet rs1 = st1.executeQuery("SELECT * FROM data"); 只执行一次。

第一次循环 while(rs.next()) 时,您将获取 rs1 的全部内容以检查发件人 ID 是否正确。

然后在 while(rs.next()) 上的第二次迭代,因为 rs1 已经被获取 while(rs1.next()) 将返回 false

为了让您的代码正常工作,您应该移动第二个查询的执行以获得如下内容:

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

但我认为只创建一个 SQL 会是一个更好的解决方案 请求加入两个表的数据并包括 where 条件。

【讨论】:

  • 嗨 Nirekin,非常感谢您的帮助!这种方法对我有用。再次感谢! :)
猜你喜欢
  • 2014-10-15
  • 2019-10-26
  • 2022-01-03
  • 2014-05-05
  • 2011-04-28
  • 2015-04-01
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多