来自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循环遍历它。
也许只是因为我头疼......
答案 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;
}