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

时间:2016-03-31 16:22:54

标签: php mysql mysqli pdo

我正在尝试创建一个从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;
 }
}

但它不起作用。任何想法如何显示所需?

2 个答案:

答案 0 :(得分:2)

获取您正在寻找的内容的最简单方法可能是简单的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

An SQLfiddle to test with

答案 1 :(得分:0)

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