【问题标题】:MySQl: How to groupby ('year') a column with date format, ignoring month and dayMySQl:如何分组('年')日期格式的列,忽略月份和日期
【发布时间】:2019-03-09 12:06:27
【问题描述】:

我正在使用 Laravel 构建一个应用程序。我正在使用 Eloquent 和 MySql 数据库。在我的 MySQL 数据库中,我有一个像这样的表 EVENTS:

id  EVENT   YEAR
1   event1  2000-05-27
2   event2  2018-01-01
3   event3  2000-02-12
4   event4  2000-06-03

这个例子只是为了简单起见,显然我的数据库随时都有数百个事件发生。

年份列中的数据为“日期”格式

我需要从这个 MySQL 表中获取每年发生的事件的简历。在示例中将是

year    number of events
2000    3
2018    1

我这样做了:

$years = Event::groupBy('year')
                    ->selectRaw('count(*) as total, year')
                    ->get();

我明白了:

year    number of events
2000    1
2018    1
2000    1
2000    1

因为列中的每个日期都不同(在示例表中:2000-02-12 !== 2000-06-03 !== 2000-05-27)。

我需要将每年发生的所有事件组合在一起,而不考虑月份和日期。

问题是:

即使事件发生在不同的日期和月份,我如何按“年”列分组,但只考虑年份?

【问题讨论】:

  • 通过使用函数,MySQL 将不得不通过痛苦的行来构建所有年份的列表。如果表中有几行,这没什么大不了的,但是随着行数的增加,性能将开始下降。如果您使用的是 MySQL 5.7,您可以为年份创建一个生成列,然后索引生成的列。 dev.mysql.com/doc/refman/5.7/en/…

标签: mysql laravel-5 eloquent


【解决方案1】:

由于您使用了 selectRaw,因此只需将日期转换为年份,这样您就可以像普通查询一样进行分组。

$years = Event::selectRaw('count(*) as total, YEAR(year) as year')
    ->groupBy('year')
    ->get();

【讨论】:

  • 此解决方案返回相同的结果。它按年份列出了一个买一个伙伴的所有事件,但不分组,
【解决方案2】:

这是使用DATE_FORMAT 的另一种方法:

$years = Event::selectRaw("DATE_FORMAT(YEAR, '%Y') AS year, COUNT(*) AS total")
    ->groupBy('year')
    ->get();

DATE_FORMAT 比使用YEAR() 函数更灵活,它可以让我们轻松地在一列中按年和月进行分组。

【讨论】:

    【解决方案3】:

    你可以试试这个

    $event = Event::selectRaw('count(*) as yearTotal, YEAR(year) as yearName')->groupBy(\DB::raw('YEAR(year)'))->get();
    

    【讨论】:

      猜你喜欢
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2021-08-02
      • 2018-12-29
      相关资源
      最近更新 更多