将搜索结果按"今天","在过去7天","在上个月"和#34;年龄较大的"

时间:2015-06-19 00:39:30

标签: mysql sql database group-by

我有一个简单的问题,涉及按日期对行进行分组以及#34;叙述"周期。 让我们假设我的文章非常简单。 ID是PK,标题和日期。日期列是日期时间/时间戳。

我想以某种方式对我的结果进行分组,以便我可以在视图中显示它们,如

今天写道:

  • art 944
  • art 943

写于最近7天:

  • art 823
  • art 743

写于最近30天:

  • art 520
  • art 519
  • art 502

旧版:

  • art 4
  • art 3
  • art 1

我可以通过一些 group by 语句在一个查询中实现这一点吗?

3 个答案:

答案 0 :(得分:3)

戈登应该赞成写这篇文章。但是我想你可能只想附加一个带有相应描述符的列,并且可能按照你希望看到它们的顺序对它们进行排序。

select
    title,
    case when date = curdate() then 'today'
         when date >= curdate() - interval 6 day then 'last 7 days'
         when date >= curdate() - interval 29 day then 'last 30 days'
         else 'older'
    end as bucket,

from ...
order by
    case
        when date  = curdate() then 1
        when date >= curdate() - interval 6 day then 2
        when date >= curdate() - interval 29 day then 3
        else 4
    end,
    title ...

看起来你没有按字母顺序排列标题。如果您希望它们按年龄排序,则删除案例表达式并使用日期值。

答案 1 :(得分:0)

您可以对分组列使用 public class Survey { public int SurveyId { get; set; } [Required] public string Description { get; set; } [Required] public string Classification { get; set; } [Required] public int Score1{ get; set; } [Required] public int Score2{ get; set; } public string Notes { get; set; } } 语句。像这样:

case

答案 2 :(得分:0)

谢谢戈登。这很简单...... 这就是我想要的。

select
id,
title,
published_at,
(case
    when published_at > curdate() then 'future article'
    when published_at = curdate() then 'today'
    when published_at >= curdate() - interval 6 day then 'last 7 days'
    when published_at >= curdate() - interval 29 day then 'last 30 days'
    else 'older'
end) as 'when' 
from
    articles
order by
    published_at desc