使用原生Sql查询实现按分类推送最新文章到首页

一般在网站的首页都会有网站最新文章的推送,而这些文章又属于不同的分类。如果某个分类的文章突然集中在一个时间段发布,那么就会造成首页上所有文章都是该分类的文章,其他的文章分类就变成不可见的了。所以,我希望能对它进行改进。

思路

网站中一旦有最新的文章发布那么该文章及其分类就会推送到网站的首页,如果在该分类下又有新的文章发布,那么后发布的文章会替换先发布的文章。每个分类可以推送不多于N篇文章。

解决方法

为了解决该问题我首先想到了使用Group BY,让所有文章按照分类号来分组,然后按照发布时间来降序排列。

sql代码可表示为:

select * from tb_blog group by 分类号 order by 发布时间 desc

然而,这样做了以后我发现,虽然文章按照分类号分组了,也就是每个分类号只有一篇文章在结果集中,但是,由于先分组然后按发布时间降序排序,这就导致了先按照分类号进行了升序排列,在此基础上再按时间降序,这就导致了最新发布的文章不一定会出现在首页。看来问题并不像想的那么简单。

解决方法

经过一天的苦苦查找和多次尝试,终于找到了解决方法,以下的SQL语句可以用于向首页按分类推送最新发表的N篇文章的集合(10篇),代码如下:

select a1.文章名称 ,a1.发布时间,a1.分类号
      from 文章表 a1 inner join (
      select a.分类号,a.发布时间 from 文章表 a
      left join 文章表 b on a.分类号=b.分类号
      and a.发布时间<=b.发布时间 group by
      a.分类号,a.发布时间 having count(b.发布时间)<=N
      ) b1 on a1.分类号=b1.分类号 and a1.发布时间=b1.发布时间
      order by a1.发布时间 desc limit 10

大家有时间的话,可以自己在纸上推演一下整个过程。亲测,代码可用。如果您遇到类似问题,一定会有所帮助。如果您有更好的方法,也可以给我留言。

本文首发于 顶求网,转载请注明来源。

时间: 2025-01-31 07:42:30

使用原生Sql查询实现按分类推送最新文章到首页的相关文章

Hibernate5.2之原生SQL查询

Hibernate5.2之原生SQL查询 一. 介绍  在上一篇博客中笔者通过代码的形式给各位读者介绍了Hibernate中最重要的检索方式--HQL查询.在本博文中笔者将向各位读者介绍Hibernate中的原生SQL查询,虽为原生SQL查询,但是笔者认为Hibernate在针对不同的数据库在分页语句的处理上做的很不错,我们不用去关心使用的是何种的数据库.本博文会沿用<Hibernate5.2之HQL查询>中的POJO类和配置文件,请各位看官在阅读本博文之前请先阅读该文章,本篇文章会将HQL中

使用hibernate原生sql查询,结果集全为1的问题解决

问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Object>> listTest = this.getService().getListBySql(sqlTest); for (Map<Object, Object> m : listTest) { for (Object k : m.keySet()) { System.out.pr

Hibernate 的原生 SQL 查询

Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该接口是Query接口的子接口.         执行SQL查询步骤如下:         1.获取Hibernate Session对象         2.编写SQL语句         3.通过Session的createSQLQuery方法创建查询对象         4.调用SQ

hibernate使用原生SQL查询返回结果集的处理

今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQuery拉来来实现SQL语句的查询,具体用法:session.createSQLQuery(sql),对于用SQL返回的结果集是一个什么样的结果集都毫无记忆.自己查了下,才知道,原来是返回一个Object类型数组的list集合,而其中Object类型的数组里的值则与sql语句中的查询项相对应,如果是s

Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1

第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 1.1标量查询 最基本的SQL查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FROM CATS").list(); sess.createSQL

Hibernate原生SQL查询多表关联,SQL语句要注意的问题

Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Question 和 Answer分别对应数据表 question 和answer. 并且表 question 和answer 的字段大部分都一样,字段数目也一样. 执行如下的操作: 1> 使用hibernate 使用原生SQL查询, Query q = session.createSQLQuery(sql).

Hibernate 的SQLQuery接口addScalar方法 (原生sql查询)

在平时开发中Hibernate提供的hql基本能够满足我们的日常需求.但是在有些特殊的情况下,还是需要使用原生的sql,并且希望sql查询出来的结果能够绑定到pojo上.hibernate API中的createSQLQuery  和createQuery接口. 就像在这次的项目中,因为表结构要变化,有个新的需求: 要从一个表中查询极个别的字段并且还有几个是求多条数据的和的,之前一直在使用hibernate的API,使用的都是映射过得对象. 原对象及表结构是这样的: @Entity @Table

Hibernate 使用原生SQL查询无法使用别名问题

最近遇到一个问题就是Hibernate在使用原生SQL进行多表联合查询别名的问题,一直报错,说是找不到某列,经过向别人咨询最后得出了解决方案 需要向数据库连接字符串中加入属性,具体如下 common.db.driverClassName=com.mysql.jdbc.Driver common.db.url=jdbc:mysql://10.10.11.8:3306/cm_mini_1?useOldAliasMetadataBehavior=true common.db.username=user

slick for play 使用原生sql查询以及拼接sql

在play中用函数式框架slick来操作数据库是一件很爽的事情.但有时因为某些特殊场景又不得不用原生的sql了. 还好slick支持这种写法,可以看看slick官方文档,Slick Plain SQL queries http://slick.lightbend.com/doc/3.1.1/sql-to-slick.html#slick-plain-sql-queries 下面说说我的场景,我的一个系统中有一个表格,由于用这个系统的也都是技术人员,为了方便就直接在表格上面开放了一个sql查询框,