Even though there are multiple questions like this I can’t get my query to return the row with the most recent date with a group by.
I have the following table..
| message_id | from | to | created_at | status ---------------------------------------------- | 1 | 1 | 2 | 2017-04-06 | 1 | 2 | 1 | 2 | 2017-04-07 | 0 | 3 | 3 | 4 | 2017-04-06 | 1 | 4 | 3 | 4 | 2017-04-07 | 0 ----------------------------------------------
and I’m tryin to get the rows with most recent date.
| message_id | from | to | created_at | status ---------------------------------------------- | 2 | 1 | 2 | 2017-04-07 | 0 | 4 | 3 | 4 | 2017-04-07 | 0
Currently this query returns the rows with the last recent date.
$messages = Message::where('to', Auth::id()) ->groupBy('from') ->orderBy('created_at', 'DESC') ->paginate(10);
Advertisement
Answer
The problem is that the result set will be first grouped then ordered. You can use nested select to get what you want.
SQL Query:
SELECT t.* FROM (SELECT * FROM messages ORDER BY created_at DESC) t GROUP BY t.from
With Laravel:
$messages = Message::select(DB::raw('t.*')) ->from(DB::raw('(SELECT * FROM messages ORDER BY created_at DESC) t')) ->groupBy('t.from') ->get();
You just need to add your where()
clauses.