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”)}
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()
都可以为您提供所需的信息。任何最适合你的情况