gpt4 book ai didi

mysql - Laravel 5.2 - 在子查询上使用 Left Join 时出现奇怪的结果

转载 作者:行者123 更新时间:2023-11-29 10:40:54 25 4
gpt4 key购买 nike

我有以下查询:

$products = Product::leftJoin(DB::Raw('(SELECT imageable_id, MIN(created_at) as min_created_at
FROM images WHERE imageable_type = "App\\\Product"
GROUP BY imageable_id) AS subquery'), function($join) {
$join->on('subquery.imageable_id', '=', 'products.id');
})
->leftJoin('images', function ($join) {
$join->on('images.imageable_id', '=', 'subquery.imageable_id')
->where('images.created_at', '=', 'subquery.min_created_at');})
->select('products.*', 'images.file_path')
->paginate(5);

当我死亡并转储查询日志时,上面的内容将被翻译如下:

"query" => """
select `products`.*, `images`.`file_path` from `products`
left join (SELECT imageable_id, MIN(created_at) as min_created_at
FROM images WHERE imageable_type = "App\\Product"
GROUP BY imageable_id) AS subquery on `subquery`.`imageable_id` = `products`.`id`
left join `images` on `images`.`imageable_id` = `subquery`.`imageable_id` and `images`.`created_at` = ?
limit 5 offset 0
"""
"bindings" => array:1 [
0 => "subquery.min_created_at"

]

这看起来是正确的,但我不确定为什么要为 subquery.min_created_at 添加绑定(bind)

现在,当我执行上述查询时,laravel images.file_path 中的查询始终为空,而我清楚地知道存在相关图像。当我通过粘贴并直接在 MySQL 命令行中运行来测试上述查询时,我得到了预期的结果,即对于具有图像的产品,图像的 file_path 不为空。当我在 MySQL 命令行中运行时,唯一的区别是我没有对 subquery.min_created_at 进行任何绑定(bind) - 我只是替换了 ?与subquery.min_created_at

关于查询为什么会这样的任何想法。如果我删除第二个左连接,它可以正常工作,但我无法选择要加载的第一个创建的图像,例如执行以下操作给我 file_path:

$products =  Product::leftJoin(DB::Raw('(SELECT imageable_id, file_path
FROM images WHERE imageable_type = "App\\\Product"
GROUP BY imageable_id) AS subquery'), function($join) {
$join->on('subquery.imageable_id', '=', 'products.id');
})
->select('products.*', 'subquery.file_path')
->paginate(5);

理想情况下,我想让我的原始查询正常工作 - 感谢任何帮助。

最佳答案

您正在使用 ->where() 作为第二个连接条件:

->where('images.created_at', '=', 'subquery.min_created_at')

这会生成

and `images`.`created_at` = ?

绑定(bind)的用途。

相反,您应该使用->on();

$join->on('images.imageable_id', '=', 'subquery.imageable_id')
->on('images.created_at', '=', 'subquery.min_created_at');

关于mysql - Laravel 5.2 - 在子查询上使用 Left Join 时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com