Foros del Web » Programando para Internet » PHP »

Recursividad

Estas en el tema de Recursividad en el foro de PHP en Foros del Web. Hola Tengo problemas cuando intento hacer un JOIN dentro una función recursive. Voy a pasar a describir las tablas primero: tabla categories: Código PHP: CREATE TABLE  ...
  #1 (permalink)  
Antiguo 18/03/2005, 06:08
 
Fecha de Ingreso: octubre-2004
Ubicación: En algún lugar de la República Oriental del Uruguay
Mensajes: 366
Antigüedad: 13 años, 1 mes
Puntos: 0
Recursividad

Hola
Tengo problemas cuando intento hacer un JOIN dentro una función recursive. Voy a pasar a describir las tablas primero:

tabla categories:

Código PHP:
CREATE TABLE `categories` (
  `
CatIdint(10unsigned NOT NULL auto_increment,
  `
CatParentIdint(10unsigned NOT NULL default '0',
  `
CatOrderSeqint(10unsigned NOT NULL default '0',
  
PRIMARY KEY  (`CatId`),
  
KEY `Categories_FKIndex1` (`CatParentId`)
TYPE=MyISAM AUTO_INCREMENT=10 ;

#
# Dumping data for table `categories`
#

INSERT INTO `categoriesVALUES (101);
INSERT INTO `categoriesVALUES (202);
INSERT INTO `categoriesVALUES (303);
INSERT INTO `categoriesVALUES (411);
INSERT INTO `categoriesVALUES (612);
INSERT INTO `categoriesVALUES (713);
INSERT INTO `categoriesVALUES (821);
INSERT INTO `categoriesVALUES (922); 
tabla: catlang

Código PHP:
CREATE TABLE `catlang` (
  `
LangIdint(10unsigned NOT NULL default '0',
  `
CatIdint(10unsigned NOT NULL default '0',
  `
CatLangNamevarchar(45NOT NULL default '',
  
PRIMARY KEY  (`LangId`,`CatId`),
  
KEY `CatLang_FKIndex1` (`CatId`),
  
KEY `CatLang_FKIndex2` (`LangId`)
TYPE=MyISAM;

#
# Dumping data for table `catlang`
#

INSERT INTO `catlangVALUES (11'a');
INSERT INTO `catlangVALUES (12'b');
INSERT INTO `catlangVALUES (13'c');
INSERT INTO `catlangVALUES (14'a1');
INSERT INTO `catlangVALUES (16'a2');
INSERT INTO `catlangVALUES (17'a3'); 
Bueno, por el momento ignoren la tabla catlang, y concentrense en la primera, cual es usada en mi escript:

Código PHP:
// $parent es el padre de los niños que queremos ver
// $level es incrementado cuando vamos llendo más profundo en el árbol,
//        usado para desplegar el árbol de una manera más leíble
function display_children($parent$level) {
   
// recuperar todos los "hijos" de el $parent
   
$result mysql_query("SELECT CatId FROM categories
                          WHERE CatParentId ='"
.$parent."'")or die(mysql_error());
                   
//print "SELECT  CatId FROM categories WHERE CatParentId =$parent<br>";
   // para desplegar cada hijo
   
while ($row mysql_fetch_array($result)) {
       
// indentar y desplegar el titulo del hijo
       
echo str_repeat('&nbsp;&nbsp;',$level).$row['CatId']."<br/>";

       
// se llama nuevamente esta función para desplegar el hijo del hijo
       
display_children($row['CatId'], $level+1);
   }
}

display_children('',0);
?> 
este codigo me va a desplegar lo siguiente:

1
4
6
7
2
8
9
3


Bueno, hasta aquí todo funciona bien, pero el problema es cuando intento juntar esta tabla con la tabla catlang, no logro juntar los IDs (categories.CatId, catlang.CatId). He intentado con lo siguiente pero no me ha funcionado:
Código PHP:
$result mysql_query("SELECT categories.CatId, catlang.CatLangName 
                               FROM categories, catlang
                               WHERE categories.CatId ='"
.$parent."' AND catlang.CatId ='".$parent."'")or die(mysql_error()); 
y luego cambio esta liena:
Código PHP:
echo str_repeat('&nbsp;&nbsp;',$level).$row['CatId']."<br/>"
por esta otra, para así tomar los textos de la tabla catlang
Código PHP:
echo str_repeat('&nbsp;&nbsp;',$level).$row['CatLangName']."<br/>"
Lo que quiero lograr es lo siguiente:
a
a1
a2
a3
b
c


Agradezco cualquier ayuda.
Ratamaster
  #2 (permalink)  
Antiguo 18/03/2005, 06:42
 
Fecha de Ingreso: octubre-2004
Ubicación: En algún lugar de la República Oriental del Uruguay
Mensajes: 366
Antigüedad: 13 años, 1 mes
Puntos: 0
Bueno, lo logré haciendo esto, igual, si a alguien sabe una solución más prolija, me gustaría mucho verla:

Código PHP:
function display_children($parent$level) {
   
// recuperar todos los "hijos" de el $parent
   
$result mysql_query("SELECT CatId FROM categories
                          WHERE CatParentId ='"
.$parent."'")or die(mysql_error());

   
// para desplegar cada hijo
   
while ($row mysql_fetch_array($result)) {
           
$result2mysql_query("SELECT CatLangName FROM catlang
                          WHERE CatId='"
.$row['CatId']."'")or die(mysql_error());
           while (
$row2 mysql_fetch_array($result2)) {
       
// indentar y desplegar el titulo del hijo
       
echo str_repeat('&nbsp;&nbsp;',$level).$row2['CatLangName']."<br/>";
       }
       
// se llama nuevamente esta función para desplegar el hijo del hijo
       
display_children($row['CatId'], $level+1);
   }
}

display_children('',0); 
Gracias
Ratamaster
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 05:21.