数据库:检索所有id的最新消息

时间:2014-06-03 13:11:55

标签: sql database select laravel

我在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');

2 个答案:

答案 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;

感谢您的帮助。