使用多个 mysql table 并在一个 html table 中显示

Use multiple mysql tables and display in one html table

我试图通过加入我的 user2 table 和 orders 将订单数量添加到 html table 的最后一列table 使用 sql 语句(我在 "user" 主键中创建 userID 并在 orders 外键中创建 userID )并使用 setAttribute 在我的 Servlet class 中,以便在我的 jsp 文件中使用 EL。这是我现在在我的 Servlet class,

中的代码
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);

在我的 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>

我的订单 table 有 userID、orderID、Shipping 和 item 作为列,我使用每个 userID 的 orderID 来计算订单数。

我只是不确定如何获取进入我的 html table 中每一行的订单数量,因为当我在 "select * FROM user2...etc" 语句中使用子查询时,它 returns 不止一行(应该如此),但我不确定如何处理多行。或者有不同的方法来处理这个问题吗?

看来你需要学习SQL

要将订单计数作为查询结果的额外列,请使用子选择,例如

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 ?

那个SQL也用了一个参数marker(?),你通过调用PreparedStatement.[=15的setString()来指定marker的值=]

不是使用字符串连接,除非你想让黑客使用SQL Injection窃取你的数据and/or删除你的表。

以防万一有人想知道我在上面收到的帮助下做了什么,(我是初学者,所以这绝对不是最佳答案或其他任何东西,它只适用于我想做的事情)

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);

然后接近我的 doPost 方法的末尾 request.setAttribute("orders", order);

在我的 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>

并为用户 class 中的订单创建了 setter 和 getter。