2013-12-20 70 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()都可以爲您提供所需的信息。無論什麼最適合你的情況。