php 如何获取用户之间的最新消息列表

klh5stk1  于 2023-05-21  发布在  PHP
关注(0)|答案(2)|浏览(103)

我希望得到一个列表的所有用户之间的消息,但只有最新的消息发送的要么user Auser B在数据库中,这些领域是fromUsertoUser
我需要每个用户之间的最新消息列表。
例如:
| 来自用户|用户|信息|date(这将是一个有效的日期iso时间字符串)|
| --------------|--------------|--------------|--------------|
| 1| 2|“你好”|6天前|
| 1| 3|“你好,兄弟”|1 days ago|
| 2| 1|“Hi admin”|5分钟前|
我想得到以下列表
| userPair|信息|
| --------------|--------------|
| 二,一|“Hi admin”|
| 一、三|“你好,兄弟”|
但是我希望userPair只包含其他用户而不包含我自己的用户,我自己的用户id将是1
我试过不少方法
实施例1

$results = DB::table("messages")
        ->selectRaw('GREATEST("fromUser", "toUser") as user1, LEAST("fromUser", "toUser") as user2, MAX(created_at) AS maxdate')
        ->where('fromUser', $user->id)
        ->orWhere('toUser', $user->id)
        ->groupByRaw('GREATEST("fromUser", "toUser"), LEAST("fromUser", "toUser")')
        ->get()
        ->flatten();

实施例2

$results = ModelsMessages::where(function($query)use($user){
            $query->where('toUser', $user->id)->orWhere('fromUser', $user->id)->orderBy("created_at");
        })->select("toUser", "fromUser")->distinct()->get();

实施例3

$results = DB::table('messages')
        ->select('*')
        ->where(function($query) use($user){
            ->where('fromUser', $user->id)
            ->orWhere('toUser', $user->id)
        })
        ->orderBy('created_at', 'desc')
        ->limit(1)
        ->unionAll(function ($query) use ($user) {
            $query->select('*')
                ->from('messages')
                ->orderBy('created_at', 'desc')
                ->limit(1);
        })
        ->get()->flatten();
nzk0hqpo

nzk0hqpo1#

如果您可以正确地修复分区,您可以使用像ROW_NUMBER这样的排名函数对日期列进行排序。然后就足以过滤掉排名高于1的记录。

WITH cte AS (
    SELECT *, 
           ROW_NUMBER() OVER(
               PARTITION BY CASE WHEN fromuser > touser THEN fromuser ELSE touser END, 
                            CASE WHEN fromuser > touser THEN touser ELSE fromuser END
               ORDER     BY date) AS rn
    FROM tab
)
SELECT CONCAT(fromuser, ', ', touser) AS userpair, 
       message
FROM cte
WHERE rn = 1;

输出

用户对信息
二,一“Hi admin”
一、三“你好,兄弟”

检查演示here

svujldwt

svujldwt2#

您可以运行此查询。
auth()->user()->id是您要在userPair中筛选的id。

use DB;

Message::orderBy('date', 'desc')
  ->where(function($q){
    $q->where('fromUser', auth()->user()->id) 
      ->orWheere('toUser', auth()->user()->id);
  })
  ->select(
    'message', 
    DB::raw("IF(fromUser = ?, toUser, fromUser) as user", [auth()->user()->id]),
    'CONCATENATE(fromUser, ",", toUser) as users' // If you want to select the exact pair you have specified in question
  )
  ->get();

相关问题