文章一对多字段的分页查询
在写首页的展示文章功能的时候,当然是少不了分页的。文章需要展示标签,一篇文章可能有多个标签,是一对多的关系。某一篇文章有四条数据,如图
测试一页展示两篇文章的时候,惊奇的发现,那一页只显示了一篇文章"使用正则获取...",而且四个标签只显示了两个,再看下上面查询的结果,似乎明白了,下一页是同样也是只有一篇文章,标签是剩下的两个。
因为一篇文章有多个标签,所以limit不能写死,如下,要不然谁知道你一页会有几篇文章呢,反正一页的标签数是肯定一样的了。
select
a.*,t.*
from article a,tag t,article_tag a_t
where a.articleId=a_t.articleId and t.tagId=a_t.tagId
order by pubdate desc
limit 5,2
这时候想到的办法是是limit需要一个公式,动态的来分页,上面语句里的5和2都应该是动态变化的,比如一页十篇文章。但问题也随之而来,我如何知道第一页应该是哪十个?这个可以根据group by (articleId) 来保证一篇文章只显示一次,但又该如何知道一篇文章有几个标签,用count?那一篇文章就要查一次,效率实在低下,这个思路就先放一放了。
那我们就一次查询完所有文章,然后前台分批次去取数据,但想一下,如果上万条文章怎么办,这一次查询要多久....而且查了那么多数据,我根本看不到那里,白查!不可取。
那我只能先查文章主表,查出十条记录,然后在到关系表中查到相关的标签,一条文章就要查询一次标签。效率也比较低下。项目跑起来效果的确是这样,刷新一次需要等待肉眼可见的时间,体验很差。。。但就先凑活着,我相信这绝对不是好方案,sql会有相关的知识,而我不知道罢了。
果然两三天后,一不小心浏览到group_concat,能将多行数据整合到一行上面,配合group by 的话,这不就是我想要的吗?立刻尝试编写sql语句
select
a.*,group_concat(t.tagName)
from article a,tag t,article_tag a_t
where a.articleId=a_t.articleId and t.tagId=a_t.tagId
group by articleId
order by pubdate desc
视图多了一个长文本字段,查看一下,会发现已经把所有想要的添加进来了,并且默认使用逗号进行分割,总算找到你了,知识的广度很重要。
下面就只要修改下mapper的XML文件,大功告成了。刷新下主页,获取文章的速度明显变快。
<resultMap id="ArticleTagMap2" type="net.peihuan.entity.Article" extends="ResultMapWithBLOBs">
<result column="group_concat(t.tagName)" property="grouptags" jdbcType="LONGVARCHAR" />
</resultMap>
<!-- 查询所有文章基本信息及他们的标签 -->
<select id="selectAllArticlesWithTags" parameterType="map" resultMap="ArticleTagMap2">
select
a.*,group_concat(t.tagName) from
article a,tag t,article_tag a_t
where a.articleId=a_t.articleId
and t.tagId=a_t.tagId
group by articleId
order by pubdate desc
limit #{beginIndex},#{offset}
</select>
发现mybatics自带分页功能,可以了解一下。