繁体   English   中英

按类别对mysqli / PDO结果进行分组并将它们分组显示

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

要使用进行测试的SQLfiddle

基于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.

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