记录一下个人在写博客“留言模块”遇到的问题。
由于本想使用一张表完成留言数据的查询,其中包括留言ID和父留言ID字段。通过父留言ID判断名下是否包含子级;最后返回给前端展示。
但在这就遇到了些问题,如果留言包含回复的话,一张表的话就必须全部查询出来,然后再递归排序。但留言数据过多会导致查询速度慢,而且只能前端分页;果断就放弃了这个想法。
看了看百度发现,可以使用两张表,一张留言表,一张留言回复表,通过留言ID,主外键绑定起来。然后嵌套子查询,实现分页查询。
留言表:
留言回复表:
PlainBashC C#CSSDiffHTML/XMLJavaJavascriptMarkdownPHPPythonRubySQL
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.myvue.mapper.leaveMapper">
<resultMap id="extOrganMap" type="com.example.myvue.pojo.LeaveWord">
<result property="leaveWordId" column="leave_id"/>
<result property="leaveWordUserId" column="leave_user_id"/>
<collection column="leave_reply" property="leaveWordReplys" resultMap="replyMap">
<id column="leave_reply_id" property="id"/>
</collection>
</resultMap>
<resultMap id="replyMap" type="com.example.myvue.pojo.LeaveWordReply">
<id column="leave_reply_id" property="id"/>
<result property="leaveWordFatherId" column="leave_father_id"/>
<result property="leaveWordReplyId" column="leave_reply_id"/>
<result property="leaveWordReplyContent" column="leave_reply_content"/>
</resultMap>
<!--获取留言-->
<select id="getLeaveWord" resultMap="extOrganMap">
select `leave_word`.*,
`leave_reply`.*
from `leave`
left join `leave_reply` on leave_reply.leave_father_id = `leave_word`.leave_id
where `leave_word`.leave_id in (select z.leave_id from (select x.leave_id from `leave_word` as x order by x.leave_date asc limit #{page} ,#{limit}) as z)
order by `leave_word`.leave_date desc, `leave_reply`.leave_reply_date desc;
</select>
</mapper>
最后结果就是实现了留言的查询,并且可以使用分页,无需一次性把数据全部查询出来而影响查询速度。 原文地址