繁体   English   中英

Laravel每组可获得n个结果

[英]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

DEMO

如果您只需要图像表中的一列,则使用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_pa​​cket的值限制

DEMO

我已经为上述查询使用了示例架构和数据集,您必须根据需要进行调整

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM