Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel根据groupBy获得结果计数_Php_Mysql_Laravel_Laravel 4 - Fatal编程技术网

Php Laravel根据groupBy获得结果计数

Php Laravel根据groupBy获得结果计数,php,mysql,laravel,laravel-4,Php,Mysql,Laravel,Laravel 4,下面是我的数据库结构 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

下面是我的数据库结构

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=计数(状态“1”)
    • $cb=计数(状态“2”)
    • $cc=count(状态“3”)}
预期结果::“US”搜索条件:-

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();
注意:我的原始MySQL有点生锈,请原谅我的错误

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

如果您想知道每个国家/地区每个省份的每个个人状态的总数,您需要在
GROUP BY
子句中指定所有这些项目。实际上,您的
计数将决定唯一省份的数量

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
如何对不存在的条目实现零计数。使用它完全取决于您的数据和数据库结构

潜在注意事项:
订购人

列中创建的
排序似乎毫无意义。如果您希望获得预期的结果,您需要特别按照以下信息进行订购:

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
国家的条目,以及在所提供的
更新时间之间的条目),然后自己在PHP中处理

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