【问题标题】:Laravel get count of results based on groupByLaravel 根据 groupBy 获取结果计数
【发布时间】:2014-01-09 02:42:47
【问题描述】:

以下是我的数据库的结构

id  name  country  province   status  updated_at    
1   A     US       TX         2       [timestamp]
2   B     UK       LON        1       [timestamp]
3   C     US       TX         2       [timestamp]
4   D     US       WA         2       [timestamp]
5   E     US       WA         3       [timestamp]
6   F     US       WA         2       [timestamp]
7   G     US       TX         1       [timestamp]

来自表单的信息(搜索条件)

  • 本例中为国家(美国)
  • 开始日期,结束日期

我需要获取以下计数和信息。

  • 按省分组{
    • $ca = count(status '1')
    • $cb = count(status '2')
    • $cc = count(status '3') }

预期结果::“美国”搜索条件:-

Province TX
    Status '1': 1
    Status '2': 2
    Status '3': 0

Province WA
    Status '1': 0
    Status '2': 2
    Status '3': 1

以下是我尝试做但失败的事情

$users = DB::table('users')
->where('country', $b)
->select('province', DB::raw('count(*) as total'))
->groupBy('province')
->whereBetween('updated_at', [
        \Carbon\Carbon::createFromDate($d, $e)->startOfMonth(),
        \Carbon\Carbon::createFromDate($f, $g)->endOfMonth()
    ])->orderBy('created_at','desc')->get();

【问题讨论】:

    标签: php mysql laravel laravel-4


    【解决方案1】:

    注意:我的原始 MySQL 有点生疏,如有错误,请见谅。

    问题 1:您按错误的列分组。

    如果您想知道每个国家/地区每个省的每个个人身份的总数,您需要在GROUP BY 子句中指定所有这些项目。事实上,您的COUNT 将决定独特省份的数量。

    GROUP BY country, province, status
    

    问题 2:没有条目的状态不会显示。

    除非您为每个状态加入到外部表中,否则您不会获得任何不存在状态的计数。鉴于您提供的数据,原始结果看起来更像这样:

    Country  Province  Status  Total
    US       TX        1       1
    US       TX        2       2
    US       WA        2       2
    US       WA        3       1
    

    Here's an example 了解如何对不存在的条目进行零计数。使用它完全取决于您的数据和数据库结构。

    潜在警告:ORDER BY

    按created_at 列排序似乎毫无意义。如果您希望获得预期的结果,您需要根据该信息专门订购:

    ORDER BY country, province, status
    

    解决方案

    我不会包含用于检索任何零结果状态的联接。但这里有一个未经测试的示例,说明如何转换为查询生成器:

    $results = DB::table('users')
        ->select(['country', 'province', 'status', DB::raw('COUNT(*) AS total')])
        ->where('country', '=', $b)
        ->whereBetween('updated_at', [
            \Carbon\Carbon::createFromDate($d, $e)->startOfMonth(),
            \Carbon\Carbon::createFromDate($f, $g)->endOfMonth()
        ])
        ->groupBy('country', 'province', 'status')
        ->orderBy('country') // defaults to ASC
        ->orderBy('province')
        ->orderBy('status')
        ->get();
    

    替代解决方案

    半复杂查询的替代方法可能是简单地查询您需要的信息集(属于$b 国家的条目,并且介于提供的updated_at 时间之间),然后在 PHP 中自行处理。

    Laravel 的 Collection 类内置了方便的方法来检查数据。这些,甚至是原始的foreach() 都可以为您提供所需的信息。无论哪种方式最适合您的情况。

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2020-06-29
      • 2017-11-19
      • 2017-07-11
      • 2020-09-07
      相关资源
      最近更新 更多