You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

公告栏列表原始帖子rownum序号连续有序显示的技术实现咨询

解决方案:实现原始帖连续序号、回复帖无序号的公告栏列表

你的核心问题是当前用rownum给所有行(包括回复帖)编号,导致原始帖的序号被回复帖打断,无法连续。下面是具体的调整方案,分为SQL和JSP两部分:

一、调整SQL查询语句

我们需要用**窗口函数ROW_NUMBER()**仅给原始帖(BSTEP=0)生成全局连续的序号,回复帖的序号设为NULL;同时保留原rownum作为分页依据,确保分页逻辑不变:

SELECT t.RN, t.BNO, t.BNAME, t.BTITLE, t.BCONTENT, t.BDATE, t.BGROUP, t.BSTEP, t.BINDENT, t.COMCNT, t.ISDEL, t.HAVEFILE 
FROM (
    SELECT 
        -- 仅给原始帖生成连续序号,回复帖序号为NULL
        CASE WHEN a.BSTEP = 0 THEN ROW_NUMBER() OVER (ORDER BY a.BGROUP DESC) ELSE NULL END AS RN,
        a.*,
        -- 保留原行号用于分页,确保分页逻辑和之前一致
        ROWNUM AS ORIGIN_RN
    FROM ABOARD a 
    WHERE 1=1 
    <if test="key != null && !key.equals('')">
        AND (a.BNAME LIKE '%${key}%' OR a.BTITLE LIKE '%${key}%' OR a.BCONTENT LIKE '%${key}%') 
    </if> 
    ORDER BY a.BGROUP DESC, BSTEP ASC
) t 
WHERE t.ORIGIN_RN BETWEEN #{start} AND #{end} 

关键逻辑说明:

  • ROW_NUMBER() OVER (ORDER BY a.BGROUP DESC):按回复组(BGROUP)倒序,给所有原始帖分配连续的序号,确保序号无缺失、顺序正确。
  • CASE表达式:只给BSTEP=0的原始帖赋值序号,回复帖的RN为NULL。
  • ORIGIN_RN:保留原来的行号用于分页,保证分页逻辑和之前完全一致,不会因为序号调整影响分页效果。

二、简化JSP视图代码

因为SQL已经处理好序号,JSP只需要判断序号是否为空即可,逻辑更简洁:

<c:choose>
    <c:when test="${empty list }">
        <tr>
            <td colspan="4" align="center">--------------暂无已发布帖子----------------</td>
        </tr>
    </c:when>
    <c:otherwise>
        <c:forEach items="${list}" var="dto" varStatus="status">
            <tr>
                <td>
                    <!-- 仅显示非空的序号(即原始帖的序号) -->
                    <c:if test="${not empty dto.rn}">${dto.rn}</c:if>
                    <c:if test="${empty dto.rn}"> </c:if>
                </td>
                <c:if test="${dto.isdel=='Y'}">
                    <td colspan="3" style="color: red; font-style: italic;"> 该帖子已被删除。</td>
                </c:if>
                <c:if test="${dto.isdel=='N'}">
                    <td><c:out value="${dto.bname}" /></td>
                    <td style="text-align:left; padding-left:${dto.bindent*20}px;">
                        <a href="detail.do?bno=${dto.bno}&page=${pageProcessing.curPage}">
                            <c:out value="${dto.btitle}" />
                        </a>
                        <span style="color: red;"><small><b>[<c:out value="${dto.comcnt}" />]</b></small></span>
                        <c:if test="${dto.havefile =='Y'}">
                            <img src="image\attachment.png" style="width:12px; height:12px;">
                        </c:if>
                    </td>
                    <td><fmt:formatDate value="${dto.bdate}" pattern="yyyy/MM/dd HH:mm:ss" /></td>
                </c:if>
            </tr>
        </c:forEach>
    </c:otherwise>
</c:choose>

为什么原来的方案不行?

原来的rownum是给所有查询到的行(包括原始帖和回复帖)依次编号,所以原始帖的序号会被中间的回复帖打断。比如原始帖1的序号是1,后面跟着3个回复帖(序号2、3、4),下一个原始帖的序号就变成了5,导致显示出来的原始帖序号不连续,不符合需求。

内容的提问来源于stack exchange,提问作者SM_Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:22:45