[英]Laravel get n results per group
我有两个表:tbl_properties和tbl_property_images。 我需要选择每个属性的最新3张图片以及property_id
。 我尝试了带有限制的子查询
DB::table('properties as p')
->leftjoin(DB::raw("(select property_id, property_image_id, image
from tbl_property_image
where property_image_status = 1
group by property_id
having count(*) = 3) as tbl_imgtemp") , 'imgtemp.property_id', '=', 'p.property_id')
->where('property_status',1)
->get();
这将返回总共3条记录。 请帮助我我该怎么做。 如何为每个属性选择3张图像?
您使用以下查询获取每个属性3张图像,假设ID列设置为自动递增,我已使用图像表的ID列选择最新图像
SELECT p.*,i.*
FROM properties p
JOIN(SELECT i1.property_id,i1.property_image_status,i1.image
FROM tbl_property_image i1
LEFT OUTER JOIN tbl_property_image i2
ON (i1.property_id = i2.property_id AND i1.property_image_id < i2.property_image_id)
WHERE i1.property_image_status = 1
GROUP BY i1.property_id,i1.property_image_status,i1.image
HAVING COUNT(*) < 3
) i
ON p.property_id = i.property_id
如果您只需要图像表中的一列,则使用group_concat()
另一种方法
SELECT p.property_id , p.title,SUBSTRING_INDEX(GROUP_CONCAT(i.image ORDER BY i.property_image_id DESC),',',3) images
FROM properties p
JOIN tbl_property_image i ON p.property_id = i.property_id
WHERE i.property_image_status = 1
GROUP BY p.property_id , p.title
但是此解决方案有一些限制,根据docs ,结果会被截断为group_concat_max_len系统变量给定的最大长度,该变量的默认值为1024。尽管返回的有效最大长度可以设置为更高的值。值受max_allowed_packet的值限制
我已经为上述查询使用了示例架构和数据集,您必须根据需要进行调整
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.