如何解决Laravel 6,MYSQL-如何使用Laravel Querybuilder或Model Eloquent离开GroupBY的子查询?
我尝试使用Laravel Eloquent来工作,但是我无法获得确切的查询。所以我做了一个原始查询来获取我想要的数据。有人可以帮助我如何将其转换为雄辩的laravel或查询生成器吗?
SELECT users.*,chat.*
FROM users
LEFT JOIN
(SELECT a.customer_id,a.time,b.content
FROM
(SELECT customer_id,MAX(datetimestamp) TIME
FROM chat_messages
GROUP BY customer_id) a
JOIN chat_messages b ON a.customer_id = b.customer_id
AND a.time = b.datetimestamp) chat ON users.id = chat.customer_id
WHERE users.customer_role != 0
ORDER BY TIME DESC
解决方法
我认为您正在尝试为每个用户获取最新的聊天消息,可以使用左联接重写查询以选择每个组的最新记录,这样更容易以laravel的查询生成器格式转换此类查询
SQL
select u.*,c.*
from users u
join chat_messages c on u.id = c.customer_id
left join chat_messages c1 on c.customer_id = c1.customer_id and c.datetimestamp < c1.datetimestamp
where c1.customer_id is null
and u.customer_role != 0
order by c.datetimestamp desc
查询生成器
DB::table('users as u')
->select('u.*,c.*')
->join('chat_messages as c','u.id','=','c.customer_id' )
->leftJoin('chat_messages as c1',function ($join) {
$join->on('c.customer_id','c1.customer_id')
->whereRaw(DB::raw('c.datetimestamp < c1.datetimestamp'));
})
->whereNull('c1.customer_id')
->where('u.customer_role','!=',0)
->orderBy('c.datetimestamp','desc')
->get();
Reference:Laravel Eloquent select all rows with max created_at
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。