2013-12-20 6 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] 

Информация из формы (критерии поиска)

  • страна (США) в этом примере
  • Дата начала, Дата окончания

Мне нужно получить следующий счет и информацию.

  • Группа по провинции {
    • $ са = счетчик (состояние '1')
    • $ CB = Количество (состояние '2')
    • $ куб.см = счетчик (состояние '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 

Решение

не будет включать в себя объединение, чтобы получить какие-либо нулевой результат статусы. Но вот непроверенный пример того, как перевести Query Builder:

$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's Collection имеет удобные методы, предназначенные для передачи данных. Эти или даже необработанные foreach() могут предоставить вам необходимую информацию. Все, что лучше всего подходит для вашей ситуации.

Смежные вопросы