Yii2,如何在 leftjoin 上添加 LIMIT 以仅返回 1 个结果
Yii2, how to add a LIMIT on a leftjoin to get only 1 result back
我正在尝试从产品 table 获取所有记录,这些记录是唯一的,但我使用 leftjoin 添加第二个 table 和这些产品的图像,但是当我这样做时return 有些产品不止一次,因为有些产品有 1 张或多张图片。我如何使用 product_images table 的限制来确保它只会获得 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();
可以通过子查询解决:
$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();
您必须在 table product_images
上使用复合索引才能获得良好的性能。
您可以使用其他排序方式 order by id
,例如您可以在 table product_images
.
中引入一个排序字段
我认为 a.id = b.id
和 a.id = c.id
是一个简单的错误。这是关于 a.id = b.product_id
和 a.id = c.product_id
.
我正在尝试从产品 table 获取所有记录,这些记录是唯一的,但我使用 leftjoin 添加第二个 table 和这些产品的图像,但是当我这样做时return 有些产品不止一次,因为有些产品有 1 张或多张图片。我如何使用 product_images table 的限制来确保它只会获得 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();
可以通过子查询解决:
$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();
您必须在 table product_images
上使用复合索引才能获得良好的性能。
您可以使用其他排序方式 order by id
,例如您可以在 table product_images
.
我认为 a.id = b.id
和 a.id = c.id
是一个简单的错误。这是关于 a.id = b.product_id
和 a.id = c.product_id
.