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

思路

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

解决方法

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

sql代码可表示为:

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

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

解决方法

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

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

注意上述代码中加入了文章发布时间相同情况下的甄别功能(想想为什么要这么做?期待着与您的交流),大家有时间的话,可以自己在纸上推演一下整个过程。亲测,代码可用。如果您遇到类似问题,一定会有所帮助。如果您有更好的方法,也可以给我留言。

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

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

  1. Hibernate原生SQL查询

    最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...

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

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  3. Hibernate5.2之原生SQL查询

    Hibernate5.2之原生SQL查询 一. 介绍  在上一篇博客中笔者通过代码的形式给各位读者介绍了Hibernate中最重要的检索方式--HQL查询.在本博文中笔者将向各位读者介绍Hiberna ...

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

    今天没事的时候,看到公司框架里有一个用原生SQL写的函数,说实在以前自己也干过这事,但好久都没有用,都忘得差不多了,现在基本都是用的hql语句来查询结果.hibernate中使用createSQLQu ...

  5. JavaEE(18) - JPA原生SQL查询和存储过程

    1. 使用原生SQL执行查询 2. 映射原生SQL查询的结果集 3. 使用原生SQL查询执行实体查询 4. 命名原生SQL查询 5. 在JPQL查询中调用存储过程

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

    第一篇:官方文档的处理方法,摘自官方 在迁移原先用JDBC/SQL实现的系统,难免需要采用hibernat native sql支持. 1.使用SQLQuery hibernate对原生SQL查询执行 ...

  7. Hibernate 的原生 SQL 查询

    Hibernate除了支持HQL查询外,还支持原生SQL查询.         对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取 ...

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

    问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Ob ...

  9. django原生sql查询如何返回字典格式

    django原生sql查询,默认返回的是元祖.如果想返回字典格式,需要自行封装: http://www.360doc.com/content/17/0802/11/9200790_676042880. ...

随机推荐

  1. Repeater的ItemCreated和ItemDataBind的区别

    Repeater 的ItemCreated的事件在第一次调用DataBind方法的时候触发,即在(IsPostBack==false)的时候才调用,当页面回滚是将不是调用该方法(错误的源头).而Ite ...

  2. J2EE常用包:

    J2EE常用包: java web开发必掌握的javax.servlet : servlet包及支持javax.servlet.http : http请求支持javax.servlet.jsp : 及 ...

  3. 二进制序列化框架easypack发布啦!

    简介 easypack是基于boost.serialization的二进制序列化框架,使用极其方便. Examples 基本类型 int age = 20; std::string name = &q ...

  4. ganglia安装-yum

    centos6.6 x64 root用户 单机一台,集群中需要监控的安装客户端就可以了 Ganglia是UC Berkeley发起的一个开源集群监视项目,设计用于测量数以千计的节点.Ganglia的核 ...

  5. 关于yarn的spark配置属性

    spark1.2.0 These are configs that are specific to Spark on YARN Property Name Default Meaning  spark ...

  6. label

    label的使用 以前只知道使用并没太注意一些细节 话说<label><input type="checkbox"/>5星</label>就可以 ...

  7. 【Android 界面效果14】RelativeLayout里常用的位置属性

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- android:layout_toLeftOf—— 该组件位于引用组件的左方 android:layou ...

  8. 安卓Design包之CoordinatorLayout配合AppBarLayout,ToolBar,TabLaout的使用

    转载: CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用 控件的简单介绍: AppBarLayout:它是继承LinerLayout实现的一个V ...

  9. Spring-boot & spring.security

    spring.security提供了一种身份认证框架,开发者可以在这个框架中实现各种方式的用户身份管理,比如:LDAP.MYSQL.OAUTH.Mongo等等. spring.security认证步骤 ...

  10. p45.asm

    ; ========================================== ; pmtest3.asm ; 编译方法:nasm pmtest3.asm -o pmtest3.com ; ...