我希望得到一个列表的所有用户之间的消息,但只有最新的消息发送的要么user A
或user B
在数据库中,这些领域是fromUser
和toUser
我需要每个用户之间的最新消息列表。
例如:
| 来自用户|用户|信息|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();
2条答案
按热度按时间nzk0hqpo1#
如果您可以正确地修复分区,您可以使用像
ROW_NUMBER
这样的排名函数对日期列进行排序。然后就足以过滤掉排名高于1的记录。输出:
检查演示here。
svujldwt2#
您可以运行此查询。
auth()->user()->id
是您要在userPair中筛选的id。