Question

En venant de une autre question de mes où j'appris à ne pas utiliser jamais des requêtes db dans les boucles que j'ai par conséquent apprendre à récupérer toutes les données d'une manière pratique avant la boucle à travers elle.

Disons que j'ai deux tables de échelles »et « articles ». Chaque produit en appartient à une échelle dans des échelles et est liée à une clé étrangère (scaleID). Je veux aller chercher toutes ces données dans une structure matricielle dans une requête telle que la première dimension sont toutes les échelles avec toutes les colonnes et imbriqué dans, tous les éléments d'une échelle, toutes les colonnes.

Résultat serait quelque chose comme ça:

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

Jusqu'à présent, je l'ai fait surtout parti pour un joint des relations individuelles. Ceci est un à plusieurs et je ne peux pas envelopper mon esprit autour de lui.

Est-ce une jointure droite, pourrait-il être fait aussi avec une sous-requête, comment obtenir les lignes complètes extérieures aussi bien dans ...

plus tard, je voudrais itérer avec des boucles foreach imbriquées.

Peut-être qu'il est juste que j'ai un mal de tête ...

Était-ce utile?

La solution

La requête doit ressembler à ceci:

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

Si vous voulez itérer avec des boucles imbriquées, vous aurez besoin de tirer ces données dans un tableau -. Nous espérons que vous n'êtes pas tirant tant que ça va manger trop de mémoire

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

Ensuite, vous pouvez parcourir:

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

Note: ceci est un peu naïve dans cette échelle de $ et $ l'article sera à la fois contenir des champs des deux tables ... si c'est un problème, vous devez modifier les affectations dans la boucle ci-dessus pour retirer seulement les champs que vous souhaitez.

Autres conseils

Il est peut-être plus facile d'abord obtenir toutes les échelles, tous les éléments.

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

ou tout un 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;
}

tout comme un réseau heureux

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top