Domanda

Per chi proviene da un'altra mia domanda dove ho imparato a non utilizzare MAI le query db all'interno di cicli che di conseguenza devono imparare a recuperare tutti i dati in un modo conveniente prima di ciclo attraverso di essa.

Diciamo che ho due tavoli 'scale' e 'oggetti'. Ogni Articolo in appartiene a una scala scale ed è collegata con una chiave esterna (scaleID). Voglio recuperare tutti i dati in una struttura a matrice in una query tale che la prima dimensione sono tutte le scale con tutte le colonne e inserita all'interno, tutti gli elementi di una scala tutte le colonne.

risultato sarebbe qualcosa di simile:

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

Finora ho fatto principalmente lasciato unisce per relazioni uno-a-uno. Si tratta di un uno-a-molti e io non può avvolgere la mia mente intorno ad esso.

E 'un diritto unirsi, potrebbe anche essere fatto con un subquery, come ottenere i file esterne piene in esso pure ...

tardi Vorrei scorrere con a cicli foreach nidificate.

Forse è solo che ho un mal di testa ...

È stato utile?

Soluzione

La query dovrebbe essere simile a questo:

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

Se si desidera scorrere con cicli annidati, avrete bisogno di tirare questi dati in un array -. Speriamo che non sta tirando indietro così tanto che mangerà troppa memoria

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

Allora è possibile scorrere:

foreach ($scales as $scale)
{
    foreach ($scale['items'] as $item)
        ; //... do stuff
}

Nota: questo è un po 'ingenuo in quella scala $ e $ articolo sarà sia contenere campi da entrambe le tabelle ... se questo è un problema, allora avete bisogno di cambiare le assegnazioni nel ciclo sopra per tirare fuori solo i campi che si desidera.

Altri suggerimenti

Potrebbe essere più facile da ottenere prima tutte le scale, quindi tutte le voci.

//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;
}

o tutto in uno 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;
}

tutto come un array felice

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top