PHP/mySQL - ネストされた行を多次元配列にフェッチする方法
-
21-08-2019 - |
質問
から来る 私のもう一つの質問 ループ内で db クエリを決して使用してはいけないことを学びました。そのため、ループする前にすべてのデータを便利な方法でフェッチする方法を学ばなければなりません。
「scales」と「items」という 2 つのテーブルがあるとします。items 内の各項目は、scales 内の 1 つのスケールに属し、外部キー (scaleID) でリンクされます。最初の次元がすべての列を含むスケールであり、その中にネストされ、1 つのクエリのすべての項目がすべての列をスケールするように、すべてのデータを 1 つのクエリで配列構造にフェッチしたいと考えています。
結果は次のようになります。
scale 1, scaleParam1, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...
scale 2, scaleParam2, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...
これまでは主に 1 対 1 の関係の左結合を行ってきました。これは 1 対多なので、まったく理解できません。
それは正しい結合ですか、サブクエリでも実行できますか、外側の行全体も取得する方法...
後で、ネストされた 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;
}
または 1 つの 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;
}
すべてが 1 つの幸せな配列として
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;
}