最近做了个留言板,模仿QQ空间、CSDN博客里的"回复"功能。于是我建了2个表:一个是留言表,一个是回复表。可以对同一留言进行多用户、多次回复。根据某条留言的ID,把对该留言的所有回复都存入一张回复表。这个功能已经实现了。剩下的工作就是从这2张表中取出需要的字段值。需要对2个表中的数据进行查询。在命令行下对MySQL进行多表查询我会做,就是这个可能需要如下操作:
String sqla = "select id,user,title,message,date,qq from liuyaninfo";
   String sqlb = "select msgid,remsg,user,date  from remsginfo";
           ps1=con.createStatement();
   ps2=con.createStatement();
           rs1=ps1.executeQuery(sqla);
   rs2=ps2.executeQuery(sqlb);
   while(rs1.next()){
                String id = rs1.getString("id");
String user = rs1.getString("user");
String title = rs1.getString("title");
String message = rs1.getString("message");
String date = rs1.getString("date");
String qq = rs1.getString("qq");                        
String remsgid=rs2.getString("msgid");
                .....
                ...........
                .....
                if(id.equals(remsgid)){
while(rs2.next()){
String remsgdate=rs2.getString("date");
String remsguser=rs2.getString("user");
String remsg=rs2.getString("remsg");
out.println("<font color=red>"+remsguser+"回复于"+remsgdate+"</font>");
out.println("<br>"+remsg);
}
}
                ......结果输入的异常是:java.sql.SQLException  就这么多!~
谁以前做过JSP页面的多表查询?

解决方案 »

  1.   

    你的持久层就是JDBC?没用到ORMapping框架?
      

  2.   

    在你的SQL查询中并没有看出你这两个表的关联关系啊。。是不是应该
    String sqla = "select L.id,L.user,L.title,L.message,L.date,L.qq,R.remsg,R.user,R.date from liuyaninfo L ,remsginfo R where id = msgid";
       或者是你的查询中的事务分界的问题
        rs1=ps1.executeQuery(sqla);
           rs2=ps2.executeQuery(sqlb);是不是一个事务啊?具体的Exception代码??
      

  3.   

    具体的异常代码就那么多:java.sql.SQLException  
    没用框架。
      

  4.   

    看你最后想怎么显示这些东东,写法有微小差异
    其中一种可以这样来写
    留言1
      回复1
      回复2
    String sqla = "select id,user,title,message,date,qq from liuyaninfo";
    ps1=con.createStatement();
    ps2=con.createStatement();
    rs1=ps1.executeQuery(sqla);
    while(rs1.next()){
        out.println(rs1.getString("title"));
        String sqlb="select msgid,remsg,user,date  from remsginfo where msgid="+rs1.getString("id");
        rs2=ps2.executeQuery(sqlb);
        while(rs2.next()){
            out.println(rs2.getString("remsg"));
        }
    }
      

  5.   

    一张表怎样设计那?
    留言表:id user title message date qq
    回复表:id msgid remsg user date
      

  6.   

    留言表:id user title message date qq prentId(该字段关联id)
      

  7.   

    留言表.id 跟 回复表.msgid 有关联,因为回复1,回复2 使用的id就是该留言的id .
      

  8.   

    刚说错了,应该是:留言表.id 跟 回复表.msgid 有关联,因为回复1,回复2 使用的msgid就是与之对应的那条留言的id .
      

  9.   

    原来我这样想也不全无道理的:
    有刚又写了个例子:<%
    Connection  con;
    Statement ps1,ps2;
    ResultSet rs1,rs2;
      try{Class.forName("com.mysql.jdbc.Driver").newInstance();
      String uri ="jdbc:mysql://localhost:3306/liuyan?useUnicode=true&characterEncoding=utf-8";
          con = DriverManager.getConnection(uri,"root","tdy218");
          String sqla = "select user from liuyaninfo";
      String sqlb = "select msgid from remsginfo";
          ps1=con.createStatement();
      ps2=con.createStatement();
          rs1=ps1.executeQuery(sqla);
      rs2=ps2.executeQuery(sqlb);
      while(rs1.next()){
            String userid = rs1.getString("user");
    out.print("<br>"+userid);
    while(rs2.next()){
    String msgid=rs2.getString("msgid");
    out.print("<br>"+msgid);
    }
    }
    rs1.close();
    rs2.close();
    con.close();
    }
    catch(Exception e){out.print(e);}
    %>运行后出来的结果是:
    202.102.240.65    //来自于表liuyaninfo
    10                //来自于表remsginfo
    10                //来自于表remsginfo
    132.218.33.5      //来自于表liuyaninfo  
    10.255.11.77      ...下同...
    10.255.11.77
    127.0.0.1
    127.0.0.1
    127.0.0.1
    10.255.9.234 
      

  10.   

    呵呵!~ 问题我解决了,可大家的回复让我不知把分给谁?那我就换个问题吧?呵呵!~
    我把MySQL重装了一遍,还装在原来的位置,可原来的数据文件(.opt和.frm)文件在新装的数据库中看不到,请问这些旧的数据文件如何导入到新的数据库那?
      

  11.   

    接分啦,我不用MYSQL,这个问题自己试试就OK了,实在不行就玩ORACLE吧!