【问题标题】:Database : Retrieve the most recent message for all id数据库:检索所有 id 的最新消息
【发布时间】:2014-07-23 20:18:16
【问题描述】:

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

【问题讨论】:

  • 这是一个很好的解决方案,但它只返回我所有数据库中最新的,而不是每个 id。可能是因为 max() 的使用不当。我试图删除 orderby() 并用 max('messages.created_at') 替换 get()。
  • 不,他在 where() 和 max() 之间。我编辑我的主题以向您展示我的新代码
  • 使用rank() by 可能是个好主意。

标签: sql database select laravel


【解决方案1】:

我找到了像你这样的解决方案。

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;

感谢您的帮助。

【讨论】:

    【解决方案2】:

    我必须看看它在 laravel 中是如何完成的,但在 MySQL(或所有 RDBMS,因为它是标准 SQL)中它是这样工作的。

    要获得某个列的最小值或最大值,您可以使用类似

    select min(your_column) from your_table;
    

    这将获取整个表的列的最小值。与

    select another_column, min(your_column) from your_table group by another_column;
    

    你得到每个组的最小值。但这并没有获得该组其他列的相应行值。除非您使用聚合函数之一,否则每个组都会“折叠”并显示每个组的随机行。您可以通过执行以下操作来验证这一点:

    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。

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多