2016-07-14 40 views
-1

Ich versuche, die Anzahl der Aufträge in der letzten Spalte in einer HTML-Tabelle hinzugefügt werden durch den Beitritt meiner user2 Tisch und orders Tabelle, die eine SQL-Anweisung (ich aus den userID in " Benutzer "Primärschlüssel und userID in orders Fremdschlüssel) und mit setAttribute in meiner Servlet-Klasse, um EL in meiner JSP-Datei zu verwenden. Dies ist der Code, den ich in meiner Servletklasse jetzt haben,Verwenden Sie mehrere MySQL-Tabellen und Display in einem HTML-Tabelle

ps = conn 
       .prepareStatement("select * FROM user2 WHERE lastname LIKE '%" 
         + searchReq + "%'"); 
     rs = ps.executeQuery(); 

     while (rs.next()) { 
      user = new User(rs.getInt("userID"), rs.getString("username"), 
        rs.getString("password"), rs.getString("firstname"), 
        rs.getString("lastname"), rs.getString("Email"), 
        rs.getInt("age")); 
      listOfUsers.add(user); 

und in meiner jsp:

<table border="1" class="search-table"> 

    <tr> 
     <td>ID</td> 
     <td>Username</td> 
     <td>Password</td> 
     <td>First Name</td> 
     <td>Last Name</td> 
     <td>Email</td> 
     <td>Age</td> 
     <td>Orders</td> 


    </tr> 

    <c:forEach items="${requestScope.lou}" var="current"> 
     <tr> 
      <td><c:out value="${current.id}" /></td> 
      <td><c:out value="${current.username}" /></td> 
      <td><c:out value="${current.password}" /></td> 
      <td><c:out value="${current.firstname}" /></td> 
      <td><c:out value="${current.lastname}" /></td> 
      <td><c:out value="${current.email}" /></td> 
      <td><c:out value="${current.age}" /></td> 
      <td><c:out value="${orders}" /></td> 


     </tr> 
    </c:forEach> 
</table> 

Meine Bestellungen Tabelle hat userID, orderID, Versand und Artikel als Spalten, und ich zähle die Anzahl der Bestellungen mit Bestell-ID pro Benutzer-ID.

Ich bin nur unsicher, wie die Anzahl der Aufträge in jeder Zeile in meiner HTML-Tabelle zu bekommen, seit wann ich eine Unterabfrage in der Anweisung "SELECT * FROM user2 ... etc" verwendet mehr als eine Zeile zurückgibt (wie es sollte) aber ich bin mir nicht sicher, wie ich mit den mehreren Zeilen umgehen soll. Oder gibt es einen anderen Weg, damit umzugehen?

+1

Sie müssen diese beiden Tabellen irgendwie zu einem zusammenfügen. – duffymo

Antwort

1

Scheint, Sie müssen lernen SQL.

Um eine Anzahl von Aufträgen als zusätzliche Spalte Ihres Abfrageergebnisses zu erhalten, verwenden Sie einen Subselect, z.

SELECT userID 
    , username 
    , password 
    , firstname 
    , lastname 
    , Email 
    , age 
    , (SELECT COUNT(*) 
      FROM orders o 
      WHERE o.userID = u.userID 
     ) AS orders 
    FROM user2 u 
WHERE lastname LIKE ? 

Das SQL verwendet auch eine Parameter-Markierung (?), und der Wert der Markierung angeben, indem setString() eines PreparedStatement aufrufen.

Sie tun NICHT tun es String-Verkettung verwenden, es sei denn, Sie wollen Hacker SQL Injection benutzen, um Ihre Daten zu stehlen und/oder Sie Tabellen löschen.

+0

danke für die Hilfe! – episkeyyy

+0

Ich habe nur Probleme, es in die HTML-Tabelle zu bekommen. – episkeyyy

0

nur falls jemand will wissen, was ich mit der Hilfe habe ich oben erhalten, (ich ein Anfänger bin, so dass es auf jeden Fall nicht die beste Antwort oder etwas ist, es funktioniert nur für das, was ich zu tun versuche)

ps = conn 
       .prepareStatement("SELECT userID, username, password, firstname, lastname, email, age, (SELECT COUNT(*) FROM orders o WHERE o.userID = u.userID) AS orders FROM user2 u WHERE lastname LIKE ? "); 
     ps.setString(1, "%" + searchReq + "%"); 

     rs = ps.executeQuery(); 

     while (rs.next()) { 
      user = new User(rs.getInt("userID"), rs.getString("username"), 
        rs.getString("password"), rs.getString("firstname"), 
        rs.getString("lastname"), rs.getString("Email"), 
        rs.getInt("age")); 

      listOfUsers.add(user); 

      order = rs.getInt("orders"); 
      user.setOrders(order); 

und dann am Ende meiner doPost Methode request.setAttribute("orders", order);

in meiner jsp:

<c:forEach items="${requestScope.lou}" var="current"> 
     <tr> 
      <td><c:out value="${current.id}" /></td> 
      <td><c:out value="${current.username}" /></td> 
      <td><c:out value="${current.password}" /></td> 
      <td><c:out value="${current.firstname}" /></td> 
      <td><c:out value="${current.lastname}" /></td> 
      <td><c:out value="${current.email}" /></td> 
      <td><c:out value="${current.age}" /></td> 
      <td><c:out value="${current.orders}" /></td> 


     </tr> 
    </c:forEach> 

und die Setter und Getter für Aufträge in der Benutzerklasse gemacht.