Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?
Posted
技术标签:
【中文标题】Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?【英文标题】:Laravel 6, MYSQL - How to Left Join a Sub Query with GroupBY using Laravel Querybuilder or Model Eloquent? 【发布时间】:2020-12-02 09:30:03 【问题描述】:我尝试使用 Laravel Eloquent 进行此操作,但我无法获得准确的查询。所以我做了一个原始查询来获取我想要的数据。任何人都可以帮助我如何将其转换为 laravel eloquent 或 Query builder?
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
【问题讨论】:
【参考方案1】:我认为您正在尝试为每个用户获取最新的聊天消息,可以使用左连接重写您的查询以选择每个组的最新记录,并且将此类查询转换为 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
【讨论】:
谢谢,是的,您是对的,先生。 @哈立德,。我正在为每个用户获取最新的聊天消息。可以使用模型吗? ,.. 你的答案有不同的结果。 @AbingPj 可以使用模型,但是您将无法像使用with()
方法那样根据最新聊天对用户进行排序,因为结果不匹配,您可以添加示例数据然后我们可以比较两个查询版本的结果以上是关于Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Laravel 5.6 在 Laravel Eloquent 中实现嵌套 MySQL 查询
如何在 laravel 5.8 或 6 中制作通用自定义包进行身份验证。*
php Usar la clase Db en Laravel para hacer consultas a la base de datos
markdown Para definir布局de la forma tradicional con Blade en Laravel usamos la directiva @yield de es