![](/img/trans.png)
[英]Group mysql results by category and display them into groups under each category
[英]Group mysqli/PDO results by category and display them into groups
我正在尝试创建一个简单的库,该库从mysql表中获取数据。
我的想法是让像这样的画廊
Category 1:
Image1 image2 image3 .. so on
Category 2:
Image4 image5 .. so on
我的表结构如下所示:
Category Table
id cat_name status
------------------------
1 Category 1 A
2 Category 2 A
Image Table
id catID image status
----------------------------
1 1 A.jpg A
2 1 B.jpg A
3 1 C.jpg A
4 2 D.jpg A
5 2 E.jpg A
我尝试查询如下所示:
class Gallery_Photo extends Model {
public function photosGallery()
{
$result = $this->query('SELECT * FROM photos WHERE status = "A" ORDER BY pcID ');
return $result;
}
}
但这是行不通的。 任何想法如何显示所需?
到达所需内容的最简单方法可能是使用简单的GROUP_CONCAT
,它会为您提供每个类别的逗号分隔图像列表。
SELECT cat_name, GROUP_CONCAT(image ORDER BY image.id) images
FROM category
JOIN image
ON category.id = image.catid
GROUP BY category.id
cat_name images
-----------------------------
Category 1 A.jpg,B.jpg,C.jpg
Category 2 D.jpg,E.jpg
基于GROUP_CONCAT的解决方案非常丑陋,因为它需要后期处理,而且,最糟糕的是,当您不仅需要图像名称,还需要一些其他信息(例如尺寸或标题)时,将使它变得很痛苦。
同时,PDO具有适合您的情况的现成功能,称为PDO :: FETCH_GROUP 。
您所需要做的就是首先选择公共字段,而其余的操作简直令人难以置信:
$sql = "SELECT cat_name, image FROM category c, image i WHERE c.id = i.catid";
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);
您将拥有一个嵌套数组,其中键将是类别名称,值将是包含图像的数组。 因此,您只需要两个嵌套循环即可完成任务:
<? foreach($data as $cat_name => $images): ?>
<?=$cat_name?><br>
<? foreach($images as $row): ?>
<img src="<?=$row['image']?>">
<? endforeach ?>
<? endforeach ?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.