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.id
和a.id = c.id
是一个简单的错误。关于a.id = b.product_id
和a.id = c.product_id
。
【讨论】:
这对于大型数据集可能效率极低。可能通过产品 ID 添加GROUP BY
可能会产生相同的结果,但性能要好得多。以上是关于Yii2,如何在 leftjoin 上添加 LIMIT 以仅返回 1 个结果的主要内容,如果未能解决你的问题,请参考以下文章