mysql - Laravel Eloquent group por registro más reciente
greatest-n-per-group (2)
Para obtener el último registro por cliente entre cada ciudad basado en
created_at
, puede usar una
created_at
DB::table(''yourTable as t'')
->select(''t.*'')
->leftJoin(''yourTable as t1'', function ($join) {
$join->on(''t.Customer'',''='',''t1.Customer'')
->where(''t.City'', ''='', ''t1.City'')
->whereRaw(DB::raw(''t.created_at < t1.created_at''));
})
->whereNull(''t1.id'')
->get();
En SQL simple sería algo así como
select t.*
from yourTable t
left join yourTable t1
on t.Customer = t1.Customer
and t.City = t1.City
and t.created_at < t1.created_at
where t1.id is null
Otro enfoque con auto unión interna sería
select t.*
from yourTable t
join (
select Customer,City,max(ID) ID
from yourTable
group by Customer,City
) t1
on t.Customer = t1.Customer
and t.City = t1.City
and t.ID = t1.ID
Estoy tratando de obtener el registro más reciente para un solo cliente en una mesa. Ejemplo:
ID Customer City Amount
1 Cust001 City1 2
2 Cust001 City2 3
3 Cust001 City1 1
4 Cust001 City2 1
5 Cust001 City2 3
6 Cust001 City3 1
7 Cust001 City3 1
8 Cust002 City1 2
9 Cust002 City1 1
10 Cust002 City2 3
11 Cust002 City1 2
12 Cust002 City2 1
13 Cust002 City3 2
14 Cust002 City3 3
15 Cust003 City1 1
16 Cust003 City2 3
17 Cust003 City3 2
Tenga en cuenta que la tabla también tiene campos created_at y updated_at. Omití esos campos por simplicidad.
Al final quiero que mi consulta regrese para Cust001:
ID Customer City Amount
3 Cust001 City1 1
5 Cust001 City2 3
7 Cust001 City3 1
Y para Cust002:
ID Customer City Amount
11 Cust002 City1 2
12 Cust002 City2 1
14 Cust002 City3 3
He intentado:
Table::where(''Customer'', ''Cust001'')
->latest()
->groupBy(''City'')
->get()
y también
Table::select(DB::raw(''t.*''))->from(DB::raw(''(select * from table where Customer = /'Cust001/' order by created_at DESC) t''))
->groupBy(''t.City'')->get();
Pero sigue devolviendo el registro más antiguo de cada grupo (y quiero el más reciente).
¿Cómo puedo conseguir esto? Si es más fácil para ustedes, pueden escribir la consulta SQL aquí y encontraré una manera de "traducirla" a la sintaxis de Laravel.
DB::table(''table'')->orderBy(''id'', ''desc'')->get();
Consulta de Laravel para obtener los últimos datos en la base de id