首页 > 解决方案 > Laravel 通过多列分组获取最新记录

问题描述

你好,我是 Laravel 的新手,我被 Laravel eloquent 困在一个复杂的查询中

这是我的消息表结构

---|-----------|-------------|--------
ID | sender_id | receiver_id | message
---|-----------|-------------|--------
 1 |   1       |   2         | Hello 
 2 |   1       |   2         | Hey hello reply
 3 |   2       |   1         | Good
 4 |   3       |   2         | Hey GOOD Morning
 5 |   3       |   2         | good night

我想从消息表中检索最近的聊天,无论用户是发送者还是接收者我想用一个组检索通过使用多个列和最新的只有一条消息

喜欢用户 2(发送者或接收者)

-----------|-------------|---------------
 sender_id | receiver_id | message
-----------|-------------|---------------
   2       |   1         | Good
   3       |   2         | good night

这是我雄辩的查询

$user = auth()->user(); //User_id 2 based on logged in user either sender or reciever
Message::where('user_id', $user->id)
        ->orWhere('receiver_id', $user->id)
        ->select('user_id','receiver_id')
        ->groupBy('user_id','receiver_id')
       ->get();

结果

all: [
   App\Models\Message {
        user_id: 1,
        receiver_id: 2,
   }, // don't want this record
   App\Models\Message {
        user_id: 2,
        receiver_id: 1,
   },
   App\Models\Message {
        user_id: 3,
        receiver_id: 2,
   },
],

如果我尝试使用 latest() 方法,那么它会显示错误时间戳在表中

使用消息'SQLSTATE [42000] 照亮/数据库/查询异常:

语法错误或访问冲突:1055 ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中并且包含非聚合列

我不想更新mysql_strict模式config/database.php

它不能正常工作任何人都可以帮助我或任何好的建议或想法

任何帮助将不胜感激

标签: phpmysqllaravellaravel-5eloquent

解决方案


你能弄清楚如何在 Laravel 中表达这一点吗?

**Schema (MySQL v5.7)**

CREATE TABLE my_table
(ID SERIAL PRIMARY KEY
,sender_id INT NOT NULL
,receiver_id INT NOT NULL
,message VARCHAR(50) NOT NULL
);

INSERT INTO my_table VALUES
(1,1,2,'Hello'),
(2,1,2,'Hey hello reply'),
(3,2,1,'Good'),
(4,3,2,'Hey GOOD Morning'),
(5,3,2,'good night');

---

**Query #1**

SELECT a.*
  FROM my_table a
  JOIN
     ( SELECT MAX(id) id
         FROM my_table
        WHERE 2 IN(sender_id,receiver_id)
        GROUP
           BY LEAST(sender_id,receiver_id)
            , GREATEST(sender_id,receiver_id)
     ) b
    ON b.id = a.id;

| ID  | sender_id | receiver_id | message    |
| --- | --------- | ----------- | ---------- |
| 3   | 2         | 1           | Good       |
| 5   | 3         | 2           | good night |

---

在 DB Fiddle 上查看


推荐阅读