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

思路

网站中一旦有最新的文章发布那么该文章及其分类就会推送到网站的首页,如果在该分类下又有新的文章发布,那么后发布的文章会替换先发布的文章。每个分类可以推送不多于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. laravel 5.0 artisan 命令列表(中文简体)

    #php artisan list Laravel Framework version Usage: [options] command [arguments] Options(选项): --help ...

  2. Linux上安装使用boost入门指导

    Data Mining Linux上安装使用boost入门指导 获得boost boost分布 只需要头文件的库 使用boost建立一个简单的程序 准备使用boost二进制文件库 把你的程序链接到bo ...

  3. java 数组初始化

    一维数组 1)   int[] a;   //声明,没有初始化 2)   int[] a=new int[5];   //初始化为默认值,int型为0 3)   int[] a={1,2,3,4,5} ...

  4. .Net Static 与单例

    Static 关键字作为修饰符可以用于类.方法和成员变量上.其含义是对于整个应用程序生命周期内,访问该修饰符修饰的对象/方法/变量都引用到同一实例(内存地址).但正因如此在多线程下会出现线程安全问题: ...

  5. Web Api 2 用户认证模板解析-----外部用户认证模式

    一般的社交提供商不提供一个Web Service进行身份验证(有很好的理由),而提供一个身份验证的界面,其中包含了某种协议如OpenID(连接)或使用OAuth2认证.这意味着客户端应用必须使用一个浏 ...

  6. C#高级特性

    1.接口 接口与抽象基类.抽象类与接口的不同是,抽象类不仅可以定义多态接口还可以定义一些其他的成员以及构造函数.而接口只能包含抽象成员. 抽象父类创建多态接口,只有派生类才可以.而往往很多情况下非派生 ...

  7. 【阿里云产品公测】云引擎ACE java DEMO 直接部署体验

    作者:阿里云用户啊里新人 本来想根据前几个哥们的公测文章,体验一下,发现他妈的都是php的一下我就,,好吧还有群,群里高手如云,,看着文档(其实文档写的很清晰了!只不过我太懒了!)   哈哈,所以群里 ...

  8. iOS 导航栏颜色字体等的自定义

    1.设置导航栏中间文字的文字颜色和文字大小 方法一:系统方法 self.title = @"下载微课";//在有navigationController的控制器中,作用与self. ...

  9. http请求数据

    /// <summary>        /// http请求post数据        /// </summary>        /// <param name=&q ...

  10. oc中的分类/协议/属性

    1.分类:当我们想给某个类加一些方法时,如果不想通过继承这个类来实现,可以通过分类给这个类加一些行为,这个过程与继承相比更加轻量化. @interface NSString (SubClass) -( ...