Frage

Von eine andere Frage von mir , wo ich nicht je gelernt zu db-Anfragen innerhalb von Schleifen verwenden ich habe damit zu lernen, wie man auf bequeme Weise, bevor ich Schleife durch sie alle Daten holen.

Nehmen wir an, ich habe zwei Tabellen ‚Waage‘ und ‚Artikel‘. Jedes Element in Artikeln gehört zu einer Skala in Waage und ist mit einem Fremdschlüssel (scaleID) verknüpft. Ich möchte in einer Abfrage alle diese Daten in einer Arraystruktur holen, so dass die erste Dimension sind alle Skalen mit allen Spalten und verschachtelt innerhalb, werden alle Elemente einer Skala alle Spalten.

Ergebnis etwas wie das wäre:

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

bisher getan habe ich in erster Linie schließt sich links für eine Eins-zu-eins-Beziehungen. Dies ist eine Eins-zu-viele und ich kann einfach nicht wickeln meinem Kopf herum.

Ist es ein Recht kommen, könnte es auch mit einer Unterabfrage durchgeführt werden, wie die vollen äußeren Reihen in sie erhalten und ...

später würde Ich mag durch sie mit zu verschachtelten foreach-Schleifen zu durchlaufen.

Vielleicht ist es nur, dass ich Kopfschmerzen habe ...

War es hilfreich?

Lösung

Die Abfrage wie folgt aussehen sollte:

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

Wenn Sie mit verschachtelten Schleifen durchlaufen wollen, müssen Sie diese Daten in einem Array ziehen -. Hoffentlich bist du nicht wieder so viel ziehen, dass es dann zu viel Speicher fressen

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

Dann können Sie eine Schleife durch:

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

Hinweis: Dies ist in diesem $ Maßstab etwas naiv und $ Artikel werden beide enthalten Felder aus beiden Tabellen ... wenn das ist ein Problem, dann müssen Sie die Zuordnungen in der Schleife oben ändern, dass nur die Felder ziehen Sie wollen.

Andere Tipps

Es könnte einfacher sein, zunächst alle auf die Waage zu bringen, dann werden alle Einzelteile.

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

oder alles in einer 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;
}

alles als eine glückliche Array

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top