Java根据其他表中的数据显示表中的数据

时间:2018-11-22 13:25:58

标签: java mysql sql database

我在弄清楚如何更改现有的sql查询时遇到了一些麻烦,这样它将允许我根据数据库中其他表的数据来显示jdbc数据库中某个表的记录。我将在下面说明我的问题:

“ DEMANDS”表的示例(列标题,“ ID”是主键):

NAME|ADDRESS|DESTINATION|DATE|TIME|ID

“ DRIVERS”表的示例(“ REGISTRATION”是主键):

USERNAME|PASSWORD|REGISTRATION|NAME

“ JOURNEY”表的示例(“ JID”是主键,“ REGISTRATION”是外键)

JID|NAME|ADDRESS|DESTINATION|DISTANCE|REGISTRATION|DATE|TIME|STATUS

下面是我用来在jsp文件上显示表的代码:

public String retrieve(String query) throws SQLException {
select(query);
return makeTable(rsToList());//results;
}

private void select(String query){        
    try {
        statement = connection.createStatement();
        rs = statement.executeQuery(query);
        //statement.close();
    }
    catch(SQLException e) {
        System.out.println("way way"+e);
        //results = e.toString();
    }
}

private String makeTable(ArrayList list) {
    StringBuilder b = new StringBuilder();
    String[] row;
    b.append("<table border=\"3\">");
    for (Object s : list) {
      b.append("<tr>");
      row = (String[]) s;
        for (String row1 : row) {
            b.append("<td>");
            b.append(row1);
            b.append("</td>");
        }
      b.append("</tr>\n");
    } // for
    b.append("</table>");
    return b.toString();
}//makeHtmlTable

private ArrayList rsToList() throws SQLException {
    ArrayList aList = new ArrayList();
    ResultSetMetaData metaData = rs.getMetaData();
    int count = metaData.getColumnCount(); //number of column
    String columnName[] = new String[count];

    for (int i = 1; i <= count; i++)
    {
        columnName[i-1] = metaData.getColumnLabel(i);
    }
    aList.add(columnName);

    int cols = rs.getMetaData().getColumnCount();
    while (rs.next()) { 
      String[] s = new String[cols];
      for (int i = 1; i <= cols; i++) {
        s[i-1] = rs.getString(i);
      } 
      aList.add(s);
    } // while    
    return aList;
} //rsToList

我的查询是:

SELECT Drivers.Name, Drivers.Registration 
FROM Drivers 
LEFT JOIN Journey ON Journey.Registration = Drivers.Registration 
LEFT JOIN Demands ON Demands.Time = Journey.Time 
WHERE Demands.id IS NULL

此查询的作用是列出在需求中指定的时间可用的驱动程序表中的驱动程序(这意味着它们的注册当前不在需求的同时在旅程表的记录中)。

我似乎无法弄清楚如何更改查询以考虑日期,因此将显示的驱动程序将是在需求中指定的时间和日期可用的驱动程序,而与时间(这意味着他们的注册当前不在需求的相同时间和日期的旅程表中的记录中)。

例如,当前,如果旅程表中的驾驶员在2018-11-22预订了9:30,则对于日期为2018-11-25的需求在9:30不会显示他们因为驾驶员已经在9:30预约了,即使他们是在不同的日期。

我尝试过:

SELECT Drivers.Name, Drivers.Registration 
FROM Drivers 
LEFT JOIN Journey ON Journey.Registration = Drivers.Registration 
LEFT JOIN Demands ON Demands.Date = Journey.Date 
LEFT JOIN Demands ON Demands.Time = Journey.Time 
WHERE Demands.id IS NULL

但是,这给了我一个空指针异常错误,对此的任何帮助将不胜感激!

干杯

0 个答案:

没有答案