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

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

结果会是这样的:

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

到目前为止,我主要完成了一对一关系的左连接。这是一对多,我无法全神贯注。

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

后来我想用嵌套的 foreach 循环来迭代它。

也许只是我头疼而已……

有帮助吗?

解决方案

查询应如下所示:

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

其他提示

首先获得所有秤,然后获得所有物品可能会更容易。

//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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top