Yii2,如何在 leftjoin 上添加 LIMIT 以仅返回 1 个结果

Posted

技术标签:

【中文标题】Yii2,如何在 leftjoin 上添加 LIMIT 以仅返回 1 个结果【英文标题】:Yii2, how to add a LIMIT on a leftjoin to get only 1 result back 【发布时间】:2021-02-28 10:17:26 【问题描述】:

我正在尝试从产品表中获取所有记录,这些记录是唯一的,但我使用 leftjoin 添加带有这些产品图像的第二个表,但是当我这样做时,它会像某些产品一样多次返回某些产品1 幅或多幅图像。如何使用 product_images 表的限制来确保它只会获得 1 张图像而不是全部。下面的例子不起作用,这可能吗?

$query->select( ['a.id', 'b.image as category_image' , 'c.image as product_image'] )
        ->from( ['a' => 'product'] )
        ->leftJoin( ['b' => 'product_images'] ,'a.id = b.id AND b.type = "category" AND LIMIT = 1')
        ->leftJoin( ['c' => 'product_images'] ,'a.id = c.id AND b.type = "product" AND LIMIT = 1')
        ->all();

【问题讨论】:

你尝试过内部连接吗? 是的,我已经尝试过了,但仍然有多个结果。 实际上尝试在LIMIT之前删除AND,导致其语法不正确 试过了,这将返回错误:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 '= 1 LEFT JOIN 附近使用的正确语法 检查这个 - ***.com/questions/15626493/left-join-only-first-row 或使用内部选择 【参考方案1】:

可以通过子查询来解决:

    $query->select(['a.id', 'b.image as category_image' , 'c.image as product_image'])
        ->from(['a' => 'product'])
        ->leftJoin(['b' => 'product_images'],
            'a.id = b.product_id AND b.id = (
                select id from product_images where product_id = a.id AND type = "category" order by id limit 1)')
        ->leftJoin(['c' => 'product_images'],                        
            'a.id = c.product_id AND c.id = (
                select id from product_images where product_id = a.id AND type = "product" order by id limit 1)')
        ->all();

您必须在表 product_images 上使用复合索引才能获得良好的性能。

您可以使用其他排序为order by id,例如您可以在表product_images 中引入排序字段。

我认为a.id = b.ida.id = c.id 是一个简单的错误。关于a.id = b.product_ida.id = c.product_id

【讨论】:

这对于大型数据集可能效率极低。可能通过产品 ID 添加GROUP BY 可能会产生相同的结果,但性能要好得多。

以上是关于Yii2,如何在 leftjoin 上添加 LIMIT 以仅返回 1 个结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yii2 中创建复杂的左外连接?

yii2的多表查询

Yii2如何批量添加数据

Yii2:如何在 mPDF 中添加模型和模型 id

如何在DetailView Yii2中添加循环?

yii2如何环境部署?yii2高级模版安装教程