Выберите самую последнюю запись с groupby в Laravel - PullRequest
0 голосов
/ 28 мая 2019

У меня есть две записи в таблицах, подобные следующим:

gym_clients
+---------+---------+-----------------+
|      id | first_name|     last_name |
+---------+-----------+---------------+
|      1  |  Name 1   |        Last 1 |
|      2  |  Name 2   |        Last 2 |
+---------+-----------+---------------+

gym_client_purchases

+---------+---------+-----------------+
|      id | client_id | purchase_date |
+---------+-----------+---------------+
|      15 |       1   |    2018-04-01 |
|      16 |       1   |    2018-05-01 |
|      17 |       2   |    2018-05-01 |
+---------+-----------+---------------+

Я хочу сгруппировать по покупкам каждого клиента и показать последние.

Я пробовал этот запрос, но в группе отображается самая старая покупка (id 15).

есть идеи?

 $this->data['latestSubscriptions'] = GymPurchase::select('first_name', 'last_name', 'gym_client_purchases.*')
              ->leftJoin('gym_clients', 'gym_clients.id', '=', 'client_id')
              ->groupBy('gym_client_purchases.client_id')
              ->orderBy('gym_client_purchases.purchase_date', 'desc')
              ->get();    

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Во-первых, когда вы используете group by, вы должны указать в этом пункте столбцы, для которых запрос поступает в группу, поэтому я предлагаю вам попробовать выполнить запрос на sql engine.

У вас будетчто-то вроде этого

select first_name, last_name, A.*
from gym_client_purchases A
left Join gym_clients B on B.id = A.client_id
group by A.client_id
order By A.purchase_date desc

, и вы заметите, что это не работает

Возможно, вам нужно что-то вроде этого

select A.client_id, B.first_name, B.last_name, max(A.purchase_date)
from gym_client_purchases A
left Join gym_clients B on B.id = A.client_id
group by A.client_id, B.first_name, B.last_name
order By max(A.purchase_date) desc
0 голосов
/ 28 мая 2019

Если вы явно вызываете имена таблиц для указания их столбцов, разве это не должно быть одинаковым в предложении ON ? в вашем коде это так

$this->data['latestSubscriptions'] = GymPurchase::select('first_name', 'last_name', 'gym_client_purchases.*')
      //client_id here isn't specified
      ->leftJoin('gym_clients', 'gym_clients.id', '=', 'client_id')
      ->groupBy('gym_client_purchases.client_id')
      ->orderBy('gym_client_purchases.purchase_date', 'desc')
      ->get();

Это должно быть так:

$this->data['latestSubscriptions'] = GymPurchase::select('first_name', 'last_name', 'gym_client_purchases.*')
      ->leftJoin('gym_clients', 'gym_clients.id', '=', 'gym_client_purchases.client_id')
      ->groupBy('gym_client_purchases.client_id')
      ->orderBy('gym_client_purchases.purchase_date', 'desc')
      ->get();

Я проверил ваш код, он должен работать должным образом из-за убывания порядка, я думаю, просто небольшая опечатка в ваших фрагментах кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...