1

我有 2 张桌子。第一个包含一些全局信息,第二个包含图像列表。

当我执行这个请求时:

SELECT table1.title, table1.description, table2.image LEFT JOIN table2 ON table2.table1_id = table1.table1_id

表结构:

表格1

| table1_id | title | description |
| 1 | title1 | description1 |
| 2 | title2 | description2 |
| 3 | title3 | description3 |

表2

| id | table1_id | image |
| 1 | 1 | img/img1.png |
| 2 | 1 | img/img2.png |
| 3 | 1 | img/img3.png |
| 4 | 2 | img/img4.png |
| 5 | 2 | img/img5.png |
| 6 | 3 | img/img6.png |

我得到了类似的东西:

<?php
array(
    array('title' => 'title1', 'description' => 'description1', 'image' => 'img/img1.png'),
    array('title' => 'title1', 'description' => 'description1', 'image' => 'img/img2.png'),
    array('title' => 'title1', 'description' => 'description1', 'image' => 'img/img3.png'),
    array('title' => 'title2', 'description' => 'description2', 'image' => 'img/img4.png'),
    array('title' => 'title2', 'description' => 'description2', 'image' => 'img/img5.png'),
    array('title' => 'title3', 'description' => 'description3', 'image' => 'img/img6.png')
);
?>

这种结构的问题是重复的标题、描述。我想得到这样的东西:

<?php
array(
    array('title' => 'title1', 'description' => 'description1', 'image' => 
        array('img/img1.png', 'img/img2.png', 'img/img3.png')
    ),
    array('title' => 'title2', 'description' => 'description2', 'image' => 
        array('img/img1.png', 'img/img2.png')
    ),
    array('title' => 'title3', 'description' => 'description3', 'image' => 
        array('img/img6.png')
    )
);
?>

我的问题是:

  • 是否可以仅通过 SQL 请求获得这种数据结构(无 PHP 操作..)

  • 如果不是,我必须做什么样的 PHP 操作才能将我的第一个数组转换为我的第二个数组?

谢谢!

4

4 回答 4

2

group一下子句和group_concat功能。我不确定它是否在 PHP 中创建了一个数组,但这几乎是你想要的:

SELECT table1.title, table1.description, GROUP_CONCAT(table2.image) LEFT JOIN table2 ON table2.id = table1.id GROUP BY table1.id

您可以使用explodePHP 中的函数将结果转换GROUP_CONCAT(table2.image)为 PHP 数组

请参阅MySQL 的 group_concatPHP 的 explode函数的文档。

于 2013-05-31T18:34:25.827 回答
0

您可以对所有不同的(名称、描述)元组进行选择。然后你将有一个名称、描述和一个空的第三个元素的数组。然后遍历这个数组并获取该不同元组的所有图像。然后获取该结果并将其插入到第三个元素中。

查询获取名称/描述数组:

select distinct table1.title, table2.description left join table2 on table2.id = table1.id

查询以查找不同名称/描述元组的所有图像:

select table2.image inner join table1 on table1.id = table2.id where table1.name = arr[0] and table1.description = arr[1]
于 2013-05-31T18:34:02.617 回答
0

当您迭代结果时,您可以很容易地构建您所追求的结构,或者您将不得不操纵结果集。

<?php
$items = array();
foreach ($rows as $row) {
    if ( ! isset($items[ $row['title'] ])) {
        $items[ $row['title'] ] = array(
            'title'         => $row['title'],
            'description'   => $row['description'],
            'images'        => array($row['image']),
        );
        continue;
    }
    $items[ $row['title'] ]['images'][] = $row['image'];
}
$items = array_values($items);

安东尼。

于 2013-05-31T18:40:09.263 回答
0
PHP code:

<?php
/*here is your result array*/
$result = array(
    array('title' => 'tile1', 'description' => 'description1', 'image' => 'img/img1.png'),
    array('title' => 'tile1', 'description' => 'description1', 'image' => 'img/img2.png'),
    array('title' => 'tile1', 'description' => 'description1', 'image' => 'img/img3.png'),
    array('title' => 'tile2', 'description' => 'description2', 'image' => 'img/img4.png'),
    array('title' => 'tile2', 'description' => 'description2', 'image' => 'img/img5.png'),
    array('title' => 'tile3', 'description' => 'description3', 'image' => 'img/img6.png')
);

/*creating a new formatted array*/
$newResult = array();
foreach($result as $value){
    $newResult[$value['title']]['title'] = $value['title'];
    $newResult[$value['title']]['description'] = $value['description'];
    $newResult[$value['title']]['image'][] = $value['image'];
}

/*printing new final formatted array*/
print_r($newResult));
?>
于 2013-05-31T18:44:49.540 回答