首页 > 解决方案 > GroupBy 在使用 leftjoin 时忽略 orderBy

问题描述

我有两张桌子。

roomsid,title chatsid, content, room_id,created_at

我的目标是模式中的 fetchrooms和 orderBy 。这是一个简单的查询,但在 Laravel 中却让人头疼。我不能使用雄辩的 ORM 方式并在方法中进行排序。因此,我不得不使用.created_atchatsdescwithjoin

我的查询如下所示:

$items = $items->select("rooms.*")->join("chats", "chats.room_id", "=", "rooms.id")->orderBy("chats.created_at", "desc")->groupBy('rooms.id');

结果:

  1. 我在没有任何订单的情况下获取数据created_at
  2. 删除groupBy将导致正确的顺序,但因为它缺少groupby,所以房间将与它一样存在chats。所以这不是一个很好的方法。

我错过了什么?如果我需要包含其他信息,请在评论中告诉我。

标签: mysqllaravel

解决方案


就像评论说的那样,我应该aggregate在使用 groupby 函数时在查询中使用一个函数。基本上,它看起来像这样

$items = $items->select("rooms.*")
->selectRaw("max(chats.created_at) as latest_created_at")
->join("chats", "chats.room_id", "=", "rooms.id")
->orderBy("latest_created_at", "desc")
->groupBy('rooms.id');

然后,它将被正确订购。我会离开线程,也许有人会使用与我相同的笨拙搜索关键字并看到这个问题:)


推荐阅读