我有两个表: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张图像?
答案 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
如果您只需要图片表中的一列
,则使用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_packet
的值约束我已经使用了上述查询的示例架构和数据集,您必须根据需要调整这些