PHP / mySQL - 如何将嵌套行提取到多维数组中

时间:2008-12-10 18:49:28

标签: php mysql join subquery one-to-many

来自another question of mine,我学会了不在循环中使用数据库查询,因此我必须学习如何在循环之前以方便的方式获取所有数据。

假设我有两张桌子'刻度'和'物品'。项目中的每个项目都属于一个比例尺,并与外键(scaleID)链接。我想在一个查询中将所有数据提取到一个数组结构中,这样第一个维度就是包含所有列并嵌套在其中的所有比例,所有项目都是一个比例所有列。

结果会是这样的:

scale 1, scaleParam1, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...
scale 2, scaleParam2, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...

到目前为止,我主要完成了一对一关系的左连接。这是一对多的,我无法绕过它。

它是一个正确的连接,是否也可以使用子查询来完成,如何将完整的外部行放入其中...

稍后我想用嵌套的foreach循环遍历它。

也许只是因为我头疼......

2 个答案:

答案 0 :(得分:6)

查询应如下所示:

SELECT * FROM scales
INNER JOIN items ON scales.id = items.scale_id

如果你想使用嵌套循环进行迭代,你需要将这些数据拉入一个数组中 - 希望你不要退缩太多以至于它会占用太多内存。

$scales = array();

while ($row = mysql_fetch_assoc($data))
{
    if (!isset($scales[$row['scale_id']]))
    {
        $row['items'] = array();
        $scales[$row['scale_id']] = $row;
    }

    $scales[$row['scale_id']]['items'][] = $row;
}

然后你可以循环:

foreach ($scales as $scale)
{
    foreach ($scale['items'] as $item)
        ; //... do stuff
}

注意:这有点天真,因为$ scale和$ item都包含来自BOTH表的字段...如果这是一个问题,那么你需要更改上面循环中的赋值,只取出你想要的字段。

答案 1 :(得分:1)

首先获得所有比例,然后是所有项目可能更容易。

//first get scales
while ($row = fetchrowfunctionhere()) {
    $scale = $scales->createFromArray($row);
}

//then get items
$lastId = null;
while ($row = fetchrowfunctionhere()) {
    $scaleId = $row['scaleID'];
    if ($lastId != $scaleId) {
        $scale = $scales->getByScaleId($scaleId);
    }
    $item = $items->createFromArray($row);
    $scale->addItem($item);
    $lastId = $scaleId;
}

或一个sql中的所有内容

$lastId = null;
while ($row = fetchrowfunctionhere()) {
    $scaleData = array_slice($row, 0, 5, true);
    $itemData = array_slice($row, 5, 5, true);
    $scaleId = $scaleData['scaleID'];
    if ($lastId != $scaleId) {
        $scale = $scales->createFromArray($scaleData);
    }
    $item = $items->createFromArray($itemData);
    $scale->addItem($item);
    $lastId = $scaleId;
}

一切都像一个快乐的阵列

while ($row = fetchrowfunctionhere()) {
    $scaleData = array_slice($row, 0, 5, true);
    $itemData = array_slice($row, 5, 5, true);
    $scaleId = $scaleData['scaleID'];
    if (!isset($scales[$scaleId])) {
        $scales[$scaleId] = $scaleData;
    }
    $itemId = $itemData['itemID'];
    $scales[$scaleId]['items'][$itemId] = $itemData;
}