公告栏列表原始帖子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
相关产品推荐
相关产品推荐

