Laravel每组获得n个结果

时间:2017-12-26 05:36:15

标签: php mysql laravel

我有两个表: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张图像?

1 个答案:

答案 0 :(得分: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

但是这个解决方案有一些限制,根据文档结果被截断为group_concat_max_len系统变量给出的最大长度,该变量的默认值为1024.尽管可以设置更高的值,但是返回值的有效最大长度受max_allowed_pa​​cket

的值约束

DEMO

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