4

来自我的另一个问题,我学会了不要在循环中使用数据库查询,因此我必须学习如何在循环之前以方便的方式获取所有数据。

假设我有两个表“秤”和“项目”。items 中的每一项都属于一个 scale in scales,并与一个外键(scaleID)链接。我想在一个查询中将所有数据提取到一个数组结构中,这样第一个维度是所有列的所有比例并嵌套在其中,一个项目的所有项目都缩放所有列。

结果将是这样的:

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

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

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

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

也许只是我头疼...

4

2 回答 2

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 都将包含来自两个表的字段......如果这是一个问题,那么您需要更改上面循环中的分配以仅提取您想要的字段。

于 2008-12-10T19:23:32.117 回答
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;
}
于 2008-12-10T19:19:45.587 回答