Pregunta

Desde otra pregunta mía donde aprendí a no utilizar NUNCA consultas db dentro de bucles en consecuencia, he de aprender a buscar a todos los datos en una forma conveniente antes de bucle a través de él.

Vamos a decir que tengo 'escalas' 'y dos mesas de artículos. Cada producto en una escala pertenece en escalas y está vinculada con una clave externa (scaleID). Quiero podido recuperar todos los datos en una estructura de matriz en una consulta de tal manera que la primera dimensión son todas las escalas con todas las columnas y anidado dentro de, todos los artículos de uno escala todas las columnas.

El resultado sería algo así:

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

Hasta ahora lo que he hecho sobre todo fui une a las relaciones uno-a-uno. Este es un one-a-muchos y yo simplemente no puede envolver mi mente alrededor de ella.

¿Es un derecho unirse, podría también hacerse con una subconsulta, cómo conseguir las filas exteriores completos en él, así ...

más adelante me gustaría recorrer con al foreach anidados.

Tal vez es sólo que tengo un dolor de cabeza ...

¿Fue útil?

Solución

La consulta debe ser algo como esto:

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

Si desea recorrer con bucles anidados, que necesitará para extraer estos datos en una matriz -. Esperemos que no estás tirando hacia atrás tanto que se va a comer demasiada 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;
}

A continuación, puede recorrer:

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

Nota: este es un tanto ingenua en esa escala y $ $ artículo será tanto contener campos de ambas tablas ... si eso es un problema, entonces usted necesita para cambiar las asignaciones en el bucle de arriba para sacar sólo los campos que desee.

Otros consejos

Puede ser que sea más fácil conseguir primero todas las escalas, a continuación, todos los elementos.

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

todo como una matriz feliz

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top