PDA

Ver la Versión Completa : bucles anidados con PHP


__cadetill
17-07-2003, 22:04:30
Hola, ya estoy aqui de nuevo con una dudilla de php

Os cuento. Tengo dos tablas maestro detalle en mySQL y quiere sacar el resultado de una inner join de estas en una tabla y, claro está, en la misma celda todas las coincidencias de un registro de la cabecera (es decir, todos sus detalles)

De momento he conseguido esto

$s = "<table width=\"100%\" border=\"0\">\n";
while ( $ResultQuery = mysql_fetch_row( $IdConsulta ) ) {
$ant = $ResultQuery[0];
$s .="<tr>\n";
$s .="<td width=\"8%\"><img src=\"images/".$ResultQuery[2]."\" width=\""
.$ResultQuery[4]."\" height=\"".$ResultQuery[5]."\"></td>\n";
$s .="<td width=\"92%\" valign=\"top\"><p>Ref : ".$ResultQuery[0]."</p>\n";
$s .="<p>".$ResultQuery[6]."</p>\n";
while (($ResultQuery = mysql_fetch_row($IdConsulta)) &&
($ant == $ResultQuery[0])){
$s .="<p>".$ResultQuery[6]."</p>\n"; }
$s .= "</td>\n";
$s .= "</tr>\n";
}
$s .= "</table>\n";


pero claro, como se hacen dos lecturas de la tabla (una en cada bucle), hay registros que pierdo y no me los muestra todos.

Se que es una chorrada, pero no veo como hacerlo. Podeis darme una ayudita?

P.D. Las lineas cortadas es para que no aparezca la barra horizontal de desplazamiento

Gracias

jachguate
18-07-2003, 09:18:00
Y porque no en lugar de hacer un inner join haces dos queryes y recorres uno en cada bucle?

asi no perderias ningún registro.

Hasta luego.

__cadetill
18-07-2003, 09:59:53
Hola y gracias por responder jachguate

Pues esta solucion es la que tengo implementada de momento, pero tambien me gustaria saber la solucion a la otra, porque, vamos, creo que ha de poderse hacer, no? (almenos el Delphi sí se puede :p)

roman
20-07-2003, 17:11:49
No estoy seguro de entender. Vamos a ver...

Supongamos que tenemos dos tablas:

personas = (id, nombre)
telefonos = (id, persona_id, telefono)

Si entiendo, tu quieres mostrar una tabla y en una sola celda poner todos los detalles, en este caso, todos llos teléfonos de una persona:



+-------+------+
| pepe | 5-55 |
+-------+------+
| maria | 5-48 |
| | 5-24 |
+-------+------+




Si es así, yo lo que haría es ordenar la consulta de manera que los detallles de una persona aparezcan consecutivos:


select p.nombre, t.telefono
from personas p
left join telefonos t
on (t.persona_id = p.id)
order by p.id


// Saludos

__cadetill
20-07-2003, 17:17:48
Hola roman, y gracias por interesarte

Eso es cierto, y de hecho, el SQL que lanzo lo hace

Lo que no se hacer es recorrer la query SOLO creando una nueva fila en la tabla en el cambio de ID (segun el ejemplo que has puesto el cual expresa exactamente lo que quiero). No se si me he explicado mejor ahora :p

__hector
20-07-2003, 23:36:55
Puedes escribir una fila por cada registro, tomando en cuenta que el valor de la primera columna (nombre en el ejemplo) se imprima solo cuando sea diferente al anterior. Sirvete de una variable intermedia que vaya almacenando el ultimo nombre para hacer las comparaciones.

No creo que tengas complicaciones por la cantidad de <TD>'s que utilizes.

Suerte!

Emilio
21-07-2003, 00:37:58
Hola

Prueba con este código, te adelanto que no lo he probado y no puedo garantizarte que no tenga algún bug.


<table width="300" border="0" cellspacing="0" cellpadding="0">
<?
$anterior="";
while ( $row = mysql_fetch_array( $result ) ) {
if ( $anterior=="" ) {
?>
<tr>
<td width="50"><? echo $row["id"]; $anterior=$row["id"]; ?></td>
<td>
<?
}
echo $row["otro_campo"];
while ( $row = mysql_fetch_array( $result ) ) {
if ( $row["id"] != $anterior ) {
?>
</td></tr><tr>
<td width="50"><? echo $row["id"]; ?></td>
<td>
<?
}
else {
echo $row["otro_campo"];
}
$anterior=$row["id"];
}
}
?>
</td></tr>
</table>


Saludos
Emilio

__cadetill
21-07-2003, 00:59:00
gracias compañeros, lo pruebo y os cuento que tal me ha ido

__cadetill
21-07-2003, 03:12:28
Bueno, lo he probado y me ha funcionado :)

Como para muestr un boton.... http://www.santi-joiers.com/p1.php

Creo que me ha quedado chulo y todo :D

Gracias a todos. Nos leemos