我在Laravel网站上以与Facebook消息服务相同的方式进行内部消息服务。
所以,我想要一个组装所有会话的部分。为此,我想要用户检索最新的消息。
我在我的SQL请求中试过这个
$users = DB::table('users')
->join('messages', 'users.id', '=' ,'messages.useridsend')
->select('users.name', 'users.photo', 'messages.*')
->where('messages.useridreceive', $id)
->groupby('messages.useridsend')
->max('messages.created_at');
答案 0 :(得分:0)
我必须看看它是如何在laravel中完成的,但在MySQL(或所有RDBMS,因为它的标准SQL)中它的工作原理如下。
要获得某个列的最小值或最大值,请使用
之类的内容select min(your_column) from your_table;
这将获取整个表的列的最小值。随着
select another_column, min(your_column) from your_table group by another_column;
您获得每组的最低要求。但是这不会获得该组的其他列的相应行值。每个小组都被解雇了#34;除非您使用其中一个聚合函数,否则将显示每个组的随机行。您可以通过执行以下操作来验证这一点:
select another_column, min(your_column), max(a_third_column) from your_table group by another_column;
所以,最大的问题是,如何获得由聚合函数确定的行的相应值?
一种方法是确定使用聚合函数选择哪一行并将其连接回表:
select * from your_table
inner join (
select the_column_you're_grouping_by, min(maybe_a_timestamp_column) as min_ts from yourtable
) subquery_alias
on your_table.the_column_you're_grouping_by = subquery_alias.the_column_you're_grouping_by
and your_table.maybe_a_timestamp_column = subquery_alias.min_ts
更好的示例和其他示例如何在本手册中找到:The Rows Holding the Group-wise Maximum of a Certain Column
希望现在明白了:)你现在要做的就是把它翻译成laravel。
答案 1 :(得分:0)
我找到了像你这样的解决方案。
SELECT u.name,
u.photo,
m.*
FROM users u
INNER JOIN messages m ON u.id = m.useridsend
INNER JOIN (
SELECT useridsend,
MAX(created_at) AS created_at
FROM messages
GROUP BY useridsend
) r ON m.useridsend = r.useridsend
AND m.created_at = r.created_at
WHERE m.useridreceive=2
ORDER BY m.created_at DESC;
感谢您的帮助。