我有一个包含类别的表
Categories
id | title | visible
1 | one | 1
2 | two | null
3 | three | 1
包含上述类别照片的表格
Photos
id | category_id | title | visible
1 | 1 | photo.one | 1
2 | 1 | photo.two | null
3 | 1 | photo.three | 1
4 | 1 | photo.four | 1
5 | 2 | photo.five | null
6 | 2 | photo.six | 1
7 | 3 | photo.seven | 1
8 | 3 | photo.eight | 1
9 | 3 | photo.nine | 1
我需要只拍两张照片,每张照片都有photo.visible = 1,其中category.visible = 1。
我试过限制,但我只能限制所有记录,而不是每个类别。
结果必须是
Result
id | category_id | title | visible | category_title
1 | 1 | photo.one | 1 | one
2 | 1 | photo.three | 1 | one
3 | 3 | photo.seven | 1 | three
4 | 3 | photo.eight | 1 | three
请帮忙吗?
答案 0 :(得分:0)
如果你只需要2张照片就可以实现这一目标,但解决方案会为每个类别提供一行,两张照片名称为逗号分隔列表,如果这对你来说足够好,那么你可以使用{{ 3}}将所有照片以逗号分隔列表的每个类别和substring_index
获取,以便从group_concat
函数的结果中获取2张照片
select c.*,
substring_index(group_concat(p.title),',',2) photos
from Categories c
join Photos p on (c.id = p.category_id and p.`visible` = 1)
where c.`visible` is not null
group by c.id
结果集将类似于
ID TITLE VISIBLE PHOTOS
1 one 1 photo.one,photo.three
3 three 1 photo.eight,photo.nine
根据文档结果被截断为最大长度 由group_concat_max_len系统变量给出,该变量有一个 默认值为1024.虽然可以设置更高的值 返回值的有效最大长度受到约束 max_allowed_packet的值。