2008-12-10 6 views
4

От another question of mine, где я научился не использовать db-запросы внутри циклов, я, следовательно, должен научиться извлекать все данные удобным образом, прежде чем прокручивать его.PHP/mySQL - как извлечь вложенные строки в многомерную матрицу

Предположим, у меня есть две шкалы «шкалы» и «предметы». Каждый элемент в единицах относится к одной шкале в масштабах и связан с внешним ключом (scaleID). Я хочу получить все эти данные в структуру массива в одном запросе, так что первое измерение - это все шкалы со всеми столбцами и вложенными внутри, все элементы одного масштаба всех столбцов.

Результат будет что-то вроде этого:

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

До сих пор я сделал в основном слева присоединяется к один-к-одному отношения. Это один-ко-многим, и я просто не могу обдумать его.

ли право присоединиться, может также быть сделано с помощью подзапроса, как получить полные внешние строки в нем, а также ...

позже я хотел бы итерацию через него с вложенным циклом просмотра ,

Может быть, это просто, что у меня болит голова ...

ответ

6

запрос должен выглядеть следующим образом:

SELECT * FROM scales 
INNER JOIN items ON scales.id = items.scale_id 

если вы хотите итерации через вложенные lo ops, вам нужно будет вытащить эти данные в массив - надеюсь, вы не отступите так сильно, что он съест слишком много памяти.

$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 
} 

Примечание: это несколько наивно, что $ масштаба и $ пункт оба содержат поля из обеих таблиц ... если это проблема, то вам нужно чтобы изменить назначения в цикле выше, чтобы вытащить только нужные вам поля.

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; 
} 
+0

Должен признать, что мне придется изучить ваши решения, так как я не понимаю, что они делают. – markus 2008-12-10 19:38:23

+0

Первые 2 являются объектами, что упрощает процесс. Третий - с массивами. Вы не указали mysql в своем тексте (но теперь я вижу тег mysql), поэтому я написал общее имя функции вместо mysql_fetch_assoc. – OIS 2008-12-10 21:10:36

 Смежные вопросы

  • Нет связанных вопросов^_^