复杂的mysql查询 - 按日期分组和排序

时间:2015-03-10 09:51:45

标签: php mysql sql

我有一个新闻列表,有三个类别。我们说category1,category2,category3。每篇文章都有一个发布日期。现在可以按如下方式获取列表:

most recent article in category1
most recent article in category2
most recent article in category3
second most recent article in category1
second most recent article in category2
second most recent article in category3

如果category1和category3都有一篇文章,而category2的文章已经用完,那么上面的列表将会跟着:

third most recent article in category1
third most recent article in category3

我不知道这是否可能在mysql查询中。请帮忙!

2 个答案:

答案 0 :(得分:0)

如果您的类别数量有限,您可以循环它并在每个循环中,使用UNION连接sqls;这个sql: "SELECT * FROM news WHERE 1 GROUP BY ".$category." ORDER BY publish_date DESC LIMIT ".$categoryCount." UNION ALL"

注意:不要忘记最后一个“UNION ALL”字符串

的子字符串

答案 1 :(得分:0)

我经常看到这样的问题,尤其是涉及基于网络的应用内容时。我想要最近的X per Whatever。在这种情况下,您需要最新的3篇文章。我建议不对新闻类别表的数据进行非规范化,而不是尝试构建一个难以处理的查询。

为最近的3篇文章添加3列。然后,在articles表中添加一个触发器。当一篇文章被添加到表中时,对类别表进行更新,将其作为最新位置,并将其他两个向下移动,使其始终滚动...在触发器语法上不是正面的,但类似于以下内容更新......

update Category 
   set ThirdArticleID = SecondArticleID, 
       SecondArticleID = FirstArticleID, 
       FirstArticleID = NewArticleIDJustAdded
   where CategoryID = NewArticleCategoryID

然后,您可以按类别进行左连接,并始终使用“最新3”类似

select
      c.*,
      A1.ArticleTitle as FirstArticle,
      A2.ArticleTitle as SecondArticle,
      A3.ArticleTitle as ThirdArticle
   from
      Category C
         LEFT JOIN Articles A1
            on C.FirstArticleID = A1.ArticleID
         LEFT JOIN Articles A2
            on C.SecondArticleID = A2.ArticleID
         LEFT JOIN Articles A3
            on C.ThirdArticleID = A3.ArticleID

然后你没有任何min(),max(),group by,desc等命令担心。您可能希望预先填写这些类别文章条目,但在条目获得新文章后,它将是自我同步的。