2013-12-20 39 views
0

以下结果计数为我的数据库结构从形式Laravel得到基于GROUPBY

  • 国家(美国)在这个例子中(搜索标准)

    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 =计数(状态 '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(); 

回答

0

注:我生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()都可以为您提供所需的信息。无论什么最适合你的情况。