Исходя из другого моего вопроса, в котором я узнал, что НИКОГДА не использую запросы db в циклах, я, следовательно, должен научиться извлекать все данные удобным образом, прежде чем я прохожу через него.
Предположим, у меня есть две таблицы «весы» и «предметы». Каждый элемент в единицах относится к одной шкале в масштабах и связан с внешним ключом (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 будут содержать поля из BOTH-таблиц … Если это проблема, вам нужно изменить назначения в вышеприведенном цикле, чтобы вытащить только нужные вам поля.
Возможно, было бы легче получить все весы, а затем все предметы.
//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; }