Foros del Web » Programando para Internet » PHP »

jugando con bucles

Estas en el tema de jugando con bucles en el foro de PHP en Foros del Web. Buenas chicos, estoy dándole vueltas a la cabeza para hacer una cosa y no acabo de ver la forma, y eso que parece en principio ...
  #1 (permalink)  
Antiguo 09/03/2010, 07:02
 
Fecha de Ingreso: febrero-2003
Mensajes: 39
Antigüedad: 21 años, 2 meses
Puntos: 1
jugando con bucles

Buenas chicos, estoy dándole vueltas a la cabeza para hacer una cosa y no acabo de ver la forma, y eso que parece en principio sencillo.

Hay una tabla con 3 campos:
- Id (autonumerico)
- Empresa (varchar)
- Id_padre (int)

La cosa sería que cada vez que una empresa registre a otra subempresa, se almacene en id_padre de esa (o esas) subempresas el id de la empresa que la está registrando.
Por ejemplo:

Id: 1
Empresa: BurbujaSA
Id_padre:0 (esta seria la cabecilla, su id_padre seria 0)

Id: 2
Empresa: Pompas de Burbujas
Id_padre:1

Id: 3
Empresa: Palitos de Goma
Id_padre:1

...

Y a la vez estas subempresas registraran más subempresas:

Id: 4
Empresa: SubPalitos de Goma
Id_padre: 3

etc. etc.


La duda es, ¿como podría sacar todas las empresas relacionadas con la empresa padre? BurbujaSA en el ejemplo, que tendría Palitos de Goma, SubPalitos de Goma, etc...

Gracias
  #2 (permalink)  
Antiguo 09/03/2010, 07:12
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: jugando con bucles

Código PHP:
Ver original
  1. $sql="SELECT * FROM empresas WHERE Id_padre=3";
  2. $rs=mysql_query($sql) or die (mysql_error());
  3.  
  4. while($fila=mysql_fetch_array($rs)) {
  5.       echo $fila['Empresa'];
  6.  
  7. }
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #3 (permalink)  
Antiguo 09/03/2010, 08:44
 
Fecha de Ingreso: febrero-2003
Mensajes: 39
Antigüedad: 21 años, 2 meses
Puntos: 1
Respuesta: jugando con bucles

Cita:
Iniciado por CHuLoSoY Ver Mensaje
Código PHP:
Ver original
  1. $sql="SELECT * FROM empresas WHERE Id_padre=3";
  2. $rs=mysql_query($sql) or die (mysql_error());
  3.  
  4. while($fila=mysql_fetch_array($rs)) {
  5.       echo $fila['Empresa'];
  6.  
  7. }
Gracias, pero no me he explicado bien. Con ese código sacaría sólo "SubPalitos de Goma", yo quiero que al ver las empresas registradas de la Empresa Padre, "BurbujaSA", me salgan las que tengan su id_padre en el registro, y las subempresas registradas por empresas que hayan sido registrados por "BurbujaSA", ya que tambien pertenecen a ella.

Saludos
  #4 (permalink)  
Antiguo 09/03/2010, 10:14
Avatar de JessicaTJ  
Fecha de Ingreso: enero-2007
Ubicación: 127.0.0.1
Mensajes: 472
Antigüedad: 17 años, 3 meses
Puntos: 25
Respuesta: jugando con bucles

Usa un LEFT JOIN

Código PHP:
$sql "SELECT sid, nombre, subnombre FROM empresas AS e LEFT JOIN subempresas AS s ON e.sid = s.sid WHERE s.sid = '$id'"
sid es la tabla que "une" a las 2 tablas, lo acorte de SubempresasID

^-^ si rekieres ayuda dime
__________________
٩(͡๏̯͡๏)۶ || ٩(͡๏̯͡๏)۶
  #5 (permalink)  
Antiguo 09/03/2010, 10:14
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: jugando con bucles

Código PHP:
Ver original
  1. $sql="SELECT * FROM empresas WHERE Id_padre=3";
  2. $rs=mysql_query($sql) or die (mysql_error());
  3.  
  4. while($fila=mysql_fetch_array($rs)) {
  5.      
  6.       $sql2="SELECT * FROM empresas WHERE Id_padre=".$fila['id']." ORDER BY Empresa ASC";
  7.       $result=mysql_query($sql2) or die (mysql_error());
  8.  
  9.      echo $fila['Empresa']."<br>";
  10.       while($fila2=mysql_fetch_array($result)) {
  11.              echo $fila2['Empresa']."<br>";
  12.       }
  13.  
  14. }
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #6 (permalink)  
Antiguo 09/03/2010, 10:14
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: jugando con bucles

Cita:
Iniciado por JessicaTJ Ver Mensaje
Usa un LEFT JOIN

Código PHP:
$sql "SELECT sid, nombre FROM empresas AS e LEFT JOIN subempresas AS s ON e.sid = s.sid WHERE s.sid = '$id'"
sid es la tabla que "une" a las 2 tablas, lo acorte de SubempresasID

^-^
Creo que el problema es que lo tiene todo en la misma tabla.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #7 (permalink)  
Antiguo 09/03/2010, 10:16
Avatar de JessicaTJ  
Fecha de Ingreso: enero-2007
Ubicación: 127.0.0.1
Mensajes: 472
Antigüedad: 17 años, 3 meses
Puntos: 25
Respuesta: jugando con bucles

Cita:
Iniciado por CHuLoSoY Ver Mensaje
Creo que el problema es que lo tiene todo en la misma tabla.
Cual es la estructura de tu BDD?
__________________
٩(͡๏̯͡๏)۶ || ٩(͡๏̯͡๏)۶
  #8 (permalink)  
Antiguo 09/03/2010, 10:39
 
Fecha de Ingreso: febrero-2003
Mensajes: 39
Antigüedad: 21 años, 2 meses
Puntos: 1
Pregunta Respuesta: jugando con bucles

Gracias a ambos. Problemillas que he visto:

Chulosoy, probé el código y funciona, pero sólo llega a 2 niveles del árbol, yo quiero algo que lo haga sin limitaciones.

JessicaTJ, no entiendo , puedes poner un caso práctico, por básico que sea, donde aplicar esa sentencia y mostrar resultados?

Se me ocurrió una forma para sacar todos los registros como quiero, pero tiene el problema de que no sé como formatearlo para que parezca un árbol, y me da que es un poco chapucero en general:

Código PHP:
$idpadre=//el id del que quiero que salgan todos sus subempresas
                    
function buscar($idpadre){
    
$sql=mysql_query("SELECT id,empresa,id_padre FROM x_arbol WHERE id_padre=".$idpadre);
    while(
$filas=mysql_fetch_array($sql)){
        echo 
$filas["id_padre"]."-".$filas["empresa"]."<br>";
        
$idpadre=$filas["id"];
        
buscar($idpadre);
                            
    }
}
buscar($idpadre); 
Si tengo (ahora en vez de empresas, que es un poco confuso, uso de ejemplo un árbol geneálogico).

Id:1 - (Padre) Juan
Id:2 - (Madre) Pepa
Id:3 - (Hijo) Luis - Id_padre:1
Id:4 - (Nieta) Jeny - Id_padre:3
Id:5 - (Nieta) Jesy - Id_padre:3
Id:6 - (Hija) Luisa - Id_padre:1
Id:7 - (Bisnieta) Loli - Id_padre:4

Lo que sale con ese código es:

1- Luis
3- Jeny
4- Loli
3- Jeny
1- Luisa

Básicamente hace lo correcto, pero no sé como tabular los resultados por id_padre, pa que no queden tan en lista.
Y si se os ocurre una forma de hacerlo menos chapucera, os lo agradecería muchísimo, saludos.

EDITO: Si, está todo en la misma tabla, la estrctura es:

id INT(11) Autonumerico PK
empresa VARCHAR (255)
id_padre INT (11)

¿me recomendais hacerlo de otra forma?
  #9 (permalink)  
Antiguo 09/03/2010, 10:43
 
Fecha de Ingreso: octubre-2009
Mensajes: 53
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: jugando con bucles

de pronto nosera mejor que separes las tablas

EMPRESA PADRE / sub empresa / otra sub empresa
id - nombre / id - nombre - codigo relacion / id - nombre - codigo relacion


al tener todo junto solo te enredas para tu consulta a la bd
  #10 (permalink)  
Antiguo 09/03/2010, 10:50
Avatar de JessicaTJ  
Fecha de Ingreso: enero-2007
Ubicación: 127.0.0.1
Mensajes: 472
Antigüedad: 17 años, 3 meses
Puntos: 25
Respuesta: jugando con bucles

Cita:
Iniciado por gastonemen Ver Mensaje
de pronto nosera mejor que separes las tablas

EMPRESA PADRE / sub empresa / otra sub empresa
id - nombre / id - nombre - codigo relacion / id - nombre - codigo relacion


al tener todo junto solo te enredas para tu consulta a la bd
Exactamente, seria mas practico y sencillo todo.

Narachamus, seria algo asi:

BDD padres
pid INT(3) Autonumerico PK
pnombre VARCHAR (255)

BDD hijos
id INT(3) Autonumerico PK
pid INT(3)
nombre VARCHAR (255)

Y unimos asi:

Código PHP:
$sql "SELECT id, nombre, pnombre FROM hijos AS h LEFT JOIN padres AS p ON h.pid = p.pid WHERE p.pid = '$pid'"
Aki estas diciendo que elija todos los hijos de cierto padre, esta sencillo una vez que entiendes lo ke kieres hacer y como llamarlo ^-^
__________________
٩(͡๏̯͡๏)۶ || ٩(͡๏̯͡๏)۶
  #11 (permalink)  
Antiguo 09/03/2010, 10:58
 
Fecha de Ingreso: febrero-2003
Mensajes: 39
Antigüedad: 21 años, 2 meses
Puntos: 1
Respuesta: jugando con bucles

¿Pero ahí no estaríamos en las mismas?

No lo querría sólo para 3, 4, 10 o 20 subempresas, podrían ser ilimitadas, ¿debería hacer una tabla para subempresas, subsubempresas, subsubsubempresas...?

Haciendo sólo una de Padres y otra de Hijos podría relacionar infinitas subempresas que estén colgadas de otras, y estas de otras, y estas de un solo padre? Es decir, sacar un listado de todas las subempresas que estan subordinadas por ese padre?

No sé si me explico bien :(
  #12 (permalink)  
Antiguo 09/03/2010, 11:08
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Respuesta: jugando con bucles

Cita:
Iniciado por Narachamus Ver Mensaje
Gracias a ambos. Problemillas que he visto:

Chulosoy, probé el código y funciona, pero sólo llega a 2 niveles del árbol, yo quiero algo que lo haga sin limitaciones.

JessicaTJ, no entiendo , puedes poner un caso práctico, por básico que sea, donde aplicar esa sentencia y mostrar resultados?

Se me ocurrió una forma para sacar todos los registros como quiero, pero tiene el problema de que no sé como formatearlo para que parezca un árbol, y me da que es un poco chapucero en general:

Código PHP:
$idpadre=//el id del que quiero que salgan todos sus subempresas
                    
function buscar($idpadre){
    
$sql=mysql_query("SELECT id,empresa,id_padre FROM x_arbol WHERE id_padre=".$idpadre);
    while(
$filas=mysql_fetch_array($sql)){
        echo 
$filas["id_padre"]."-".$filas["empresa"]."<br>";
        
$idpadre=$filas["id"];
        
buscar($idpadre);
                            
    }
}
buscar($idpadre); 
Si tengo (ahora en vez de empresas, que es un poco confuso, uso de ejemplo un árbol geneálogico).

Id:1 - (Padre) Juan
Id:2 - (Madre) Pepa
Id:3 - (Hijo) Luis - Id_padre:1
Id:4 - (Nieta) Jeny - Id_padre:3
Id:5 - (Nieta) Jesy - Id_padre:3
Id:6 - (Hija) Luisa - Id_padre:1
Id:7 - (Bisnieta) Loli - Id_padre:4

Lo que sale con ese código es:

1- Luis
3- Jeny
4- Loli
3- Jeny
1- Luisa

Básicamente hace lo correcto, pero no sé como tabular los resultados por id_padre, pa que no queden tan en lista.
Y si se os ocurre una forma de hacerlo menos chapucera, os lo agradecería muchísimo, saludos.

EDITO: Si, está todo en la misma tabla, la estrctura es:

id INT(11) Autonumerico PK
empresa VARCHAR (255)
id_padre INT (11)

¿me recomendais hacerlo de otra forma?
No es para nada "chapucero", para hacer lo que requieres una funcion recursiva me parece lo mas adecuado, ahora, para formatear la salida tipo "arbol", puedes usar listas

EDIT: @Narachamus, tu estructura de una sola tabla es correcta, como mencionas, asi puedes manejar un numero arbitrariamente grande de "niveles"

Etiquetas: bucles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:10.