Foros del Web » Programando para Internet » PHP »

Mostrar registros concatenados

Estas en el tema de Mostrar registros concatenados en el foro de PHP en Foros del Web. Hola! tengo un menú que se maneja de la siguiente forma. Las partes del menú son: Tipo Subtipo Marca Modelo Las tablas son así. @import ...
  #1 (permalink)  
Antiguo 30/06/2011, 11:58
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Pregunta Mostrar registros concatenados

Hola! tengo un menú que se maneja de la siguiente forma.

Las partes del menú son:
  • Tipo
  • Subtipo
  • Marca
  • Modelo

Las tablas son así.

Código MySQL:
Ver original
  1. `t_tipo` (
  2.   `id_tipo` int(11) NOT NULL auto_increment,
  3.   `ti_name` varchar(25) NOT NULL,
  4.   `ti_estatus` tinyint(4) NOT NULL,
  5.   PRIMARY KEY  (`id_tipo`)
  6. )

Código MySQL:
Ver original
  1. `t_subtipo` (
  2.   `id_subtipo` int(10) unsigned NOT NULL auto_increment,
  3.   `id_tipo` int(11) NOT NULL,
  4.   `su_name` char(150) NOT NULL,
  5.   `su_estatus` int(10) unsigned NOT NULL
  6.   PRIMARY KEY  (`id_subtipo`)
  7. )

Código MySQL:
Ver original
  1. `t_marca` (
  2.   `id_marca` int(10) unsigned NOT NULL auto_increment,
  3.   `ma_name` char(150) NOT NULL,
  4.   `ma_estatus` int(11) default NULL
  5.   PRIMARY KEY  (`id_marca`)
  6. )

Código MySQL:
Ver original
  1. `t_modelos` (
  2.   `id_modelo` int(10) unsigned NOT NULL auto_increment,
  3.   `id_tipo` int(10) NOT NULL,
  4.   `id_subtipo` int(10) NOT NULL,
  5.   `id_marca` int(11) NOT NULL,
  6.   `mo_titulo` char(150) NOT NULL
  7.   PRIMARY KEY  (`id_modelo`)
  8. )

Explico!

La tabla tipo es la principal
Subtipo pertenece al Tipo, o sea debe obtener su id
La tabla Marca no posee a ninguno (no se a cual unirlo)
La tabla modelo posee a los 3

La forma en la que estoy haciendo la llamada es la siguiente:


Código PHP:
Ver original
  1. <?php
  2.   include("admin/conexion2.php");
  3.    $linke=conectar2();
  4.    $result_a=mysql_query("select * from t_tipo ORDER BY id_tipo",$linke);
  5.    while($row_a = mysql_fetch_array($result_a)) {
  6.                     echo " <li><a href='#'>".$row_a["ti_name"]."</a>
  7.                     <ul class='horizontal'>";
  8.         $tipo=$row_a["id_tipo"];           
  9.    $result_d=mysql_query("select * from t_subtipo WHERE id_tipo=".$tipo." ORDER BY id_tipo",$linke);
  10.    while($row = mysql_fetch_array($result_d)) {
  11.                     echo "
  12.                         <li><a href='#'>".$row["su_name"]."</a>";
  13.                         echo"<div class='extended'>";
  14.                         echo"<ul class='smallNav'>";
  15.         $result_m=mysql_query("select * from t_marca ORDER BY id_marca",$linke);
  16.    while($row_m = mysql_fetch_array($result_m)) {
  17.                   $subtipo=$row["id_subtipo"];
  18.                   $marca=$row_m["id_marca"];
  19.                   $result_e=mysql_query("select * from t_modelos WHERE id_subtipo=".$subtipo." AND id_marca=".$marca." ORDER BY id_modelo ;",$linke)  or die( "Error en query: $linke, el error  es: " . mysql_error() );  
  20.         while ($row_e = mysql_fetch_array($result_e)){
  21.                 $desat=" ";
  22. if ($row_e["id_marca"]=='4'){ $desat.="<a href='index2.php'><img src='images/marca-1.png'  height='30' align='center'  border='0'/>"; }
  23. if ($row_e["id_marca"]=='5'){ $desat.="<a href='index2.php'><img src='images/marca-2.png'  height='30' align='center'  border='0'/>"; }
  24. if ($row_e["id_marca"]=='6'){ $desat.="<a href='index2.php'><img src='images/marca-3.png'  height='30' align='center'  border='0'/>"; }
  25. if ($row_e["id_marca"]=='7'){ $desat.="<a href='index2.php'><img src='images/marca-4.png'  height='30' align='center'  border='0'/>"; }
  26. if ($row_e["id_marca"]=='8'){ $desat.="<a href='index2.php'><img src='images/marca-5.png'  height='30' align='center'  border='0'/>"; }
  27. if ($row_e["id_marca"]=='9'){ $desat.="<a href='index2.php'><img src='images/marca-6.png'  height='30' align='center'  border='0'/>"; }
  28. if ($row_e["id_marca"]=='10'){ $desat.="<a href='index2.php'><img src='images/marca-7.png'  height='30' align='center'  border='0'/>"; }
  29. if ($row_e["id_marca"]=='11'){ $desat.="<a href='index2.php'><img src='images/marca-8.png'  height='30' align='center'  border='0'/>"; }
  30. if ($row_e["id_marca"]=='12'){ $desat.="<a href='index2.php'><img src='images/marca-9.png'  height='30' align='center'  border='0'/>"; }
  31. if ($row_e["id_marca"]=='13'){ $desat.="<a href='index2.php'><img src='images/marca-10.png'  height='30' align='center'  border='0'/>"; }
  32. if ($row_e["id_marca"]=='14'){ $desat.="<a href='index2.php'><img src='images/marca-11.png'  height='30' align='center'  border='0'/>"; }
  33.  
  34.         echo"<li><b style='font-size:14px'>".$desat."</b></li>";
  35.        
  36.     } }
  37.    echo"</ul></div></li>";}
  38.    
  39.    echo"</ul>
  40.                 </li>";}  
  41. ?>

El problema es el siguiente! cuando tengo modelos cargados entonces aparecen siempre la marca. Quiero que salga una sola vez la marca y despues salgan los modelos (la cantidad que sean) no que se repitan las marcas siempre.

Gracias de antemano!
  #2 (permalink)  
Antiguo 30/06/2011, 12:20
 
Fecha de Ingreso: diciembre-2010
Mensajes: 22
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: Mostrar registros concatenados

He leído por encima , quizás la función "Group by" en mysql te lo solucione ya que su función es agrupar tuplas iguales.

Aunque no se si eso es lo que buscas...
  #3 (permalink)  
Antiguo 30/06/2011, 14:23
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Mostrar registros concatenados

El GROUP BY no me funciona, lo que hace es que agrupa las marcas y me muestra un solo registro de modelos, como que no hace funcionar el WHILE

Por ejm tengo 2 marcas y 2 modelos

Los 2 modelos pertenecen a una marca pero sale asi. (cabe destacar la otra marca no tiene modelos)

marca1 | modelo
marca1 | modelo

Quiero que salga:

marca1| modelo
modelo

y con el GROUP BY me sale

marca1 | modelo

No me funciona así pues, yo pienso que es una cuestión o de concatenar la tabla marca con alguna otra, o de poner una condicion, pero la desconozco.

Por favor gracias por su ayuda.
  #4 (permalink)  
Antiguo 30/06/2011, 15:00
Avatar de santris  
Fecha de Ingreso: agosto-2009
Ubicación: Sant Feliu de Llobregat
Mensajes: 955
Antigüedad: 14 años, 9 meses
Puntos: 66
Respuesta: Mostrar registros concatenados

Buenas,

Creo que tienes un poblema de diseño de la base de datos. Lo primero que deberías plantearte es: como definir bien la estructura de la bd (llevará un tiempo....).

Luego para unir tablas etc hay diferentes opciones ej:

Cita:
SELECT DISTINCTROW marca.id, modelo.nombre FROM marcas INNER JOIN modelos ON marca.id = modelo.id_marca
y opcionalmente un filtro

Cita:
WHERE marca.id = 1925
Saludos,
__________________
Tu álbum de cromos online!!
  #5 (permalink)  
Antiguo 01/07/2011, 16:48
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Mostrar registros concatenados

santris

Si tenia un problema de diseño en base de datos. al final funcionó de la siguiente forma.
  • tipo
  • subtipo (pertenece al tipo)
  • marca (pertenece al subtipo)
  • modelo (pertenece al subtipo y la marca)

Pero ahora tengo un problema con la condición para evitar que si no hay modelos cargados en la marca no aparezcan.

Código PHP:
<?php 
  
include("admin/conexion2.php"); 
   
$linke=conectar2();
   
$result_a=mysql_query("select * from t_tipo ORDER BY id_tipo",$linke);
   while(
$row_a mysql_fetch_array($result_a)) { 
                      echo 
" <li><a href='#'>".$row_a["ti_name"]."</a>
                    <ul class='horizontal'>"
;
        
$tipo=$row_a["id_tipo"];            
   
$result_d=mysql_query("select * from t_subtipo WHERE id_tipo=".$tipo." ORDER BY id_tipo",$linke);
   while(
$row mysql_fetch_array($result_d)) { 
                      echo 
"
                        <li><a href='#'>"
.$row["su_name"]."</a>";
                        echo
"<div class='extended'>";
                        echo
"<ul class='smallNav'>";
                        
$subtipo=$row["id_subtipo"];    
        
$result_m=mysql_query("select * from t_marca WHERE id_subtipo=".$subtipo." ORDER BY id_marca",$linke);
   while(
$row_m mysql_fetch_array($result_m)) {
$desat=" ";
if (
$row_m["id_marca"]=='4'){ $desat.="<img src='images/marca-1.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='5'){ $desat.="<img src='images/marca-2.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='6'){ $desat.="<img src='images/marca-3.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='7'){ $desat.="<img src='images/marca-4.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='8'){ $desat.="<img src='images/marca-5.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='9'){ $desat.="<img src='images/marca-6.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='10'){ $desat.="<img src='images/marca-7.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='11'){ $desat.="<img src='images/marca-8.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='12'){ $desat.="<img src='images/marca-9.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='13'){ $desat.="<img src='images/marca-10.png'  height='30' align='center'  border='0'/>"; }
if (
$row_m["id_marca"]=='14'){ $desat.="<img src='images/marca-11.png'  height='30' align='center'  border='0'/>"; }
  echo
"<li><a href='detalle-producto.php?id_modelo=".$row_m["ma_name"]."'>".$desat."</a>";
  
$marca=$row_m["id_marca"];
  
$result_e=mysql_query("select * from t_modelos WHERE  id_subtipo=".$subtipo." AND id_marca=".$marca." ORDER BY id_modelo ;",$linke)  or die( "Error en query: $linke, el error  es: " mysql_error() );  
        while (
$row_e mysql_fetch_array($result_e)){
        if(
$marca==$row_e["id_marca"]){
echo
"<li><a href='detalle-producto.php?id_modelo=".$row_e["id_modelo"]."'>".$row_e["mo_titulo"]."</a>";
    } else {
echo
"";
    }}}
   echo
"</li></ul></div></li>";}
   
   echo
"</ul>
                </li>"
;}  
?>
El último llamado a modelo debería ser, si no hay modelo en la marca cuando el id_marca=id_marca(del modelo) entonces no debería aparecer. Pero no se traducirlo!
  #6 (permalink)  
Antiguo 02/07/2011, 02:59
Avatar de santris  
Fecha de Ingreso: agosto-2009
Ubicación: Sant Feliu de Llobregat
Mensajes: 955
Antigüedad: 14 años, 9 meses
Puntos: 66
Respuesta: Mostrar registros concatenados

Cita:
...AND id_marca=".$marca." AND t_modelos.id_marca != 0 ORDER BY id_modelo
cuando creamos una clave Foranea normalmente es un (int, 0 por defecto), cuando asignas un valor a esa clave siempre será diferente de cero, entonces puedes añadir la condición AND t_modelos.id_marca != 0 para asegurarte que el modelo tiene marca.


saludos,
__________________
Tu álbum de cromos online!!

Última edición por santris; 02/07/2011 a las 03:06
  #7 (permalink)  
Antiguo 02/07/2011, 15:42
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Mostrar registros concatenados

Me está funcionando lo que indicas, pero de la siguiente forma

Código PHP:
        $result_m=mysql_query("select * from t_marca WHERE id_subtipo=".$subtipo." ORDER BY id_marca",$linke); 
   while(
$row_m mysql_fetch_array($result_m)) { 
$desat=" "
if (
$row_m["id_marca"]=='4'){ $desat.="<img src='images/marca-1.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='5'){ $desat.="<img src='images/marca-2.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='6'){ $desat.="<img src='images/marca-3.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='7'){ $desat.="<img src='images/marca-4.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='8'){ $desat.="<img src='images/marca-5.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='9'){ $desat.="<img src='images/marca-6.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='10'){ $desat.="<img src='images/marca-7.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='11'){ $desat.="<img src='images/marca-8.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='12'){ $desat.="<img src='images/marca-9.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='13'){ $desat.="<img src='images/marca-10.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='14'){ $desat.="<img src='images/marca-11.png'  height='30' align='center'  border='0'/>"; } 
  
$marca=$row_m["id_marca"]; 
  
$result_e=mysql_query("select * from t_modelos WHERE  id_subtipo=".$subtipo." AND id_marca=".$marca." AND t_modelos.id_marca != 0 ORDER BY id_modelo ;",$linke)  or die( "Error en query: $linke, el error  es: " mysql_error() );   
        while (
$row_e mysql_fetch_array($result_e)){ 
        if(
$marca==$row_e["id_marca"]){ 
          echo
"<li><a href='detalle-producto.php?id_modelo=".$row_m["ma_name"]."'>".$row_m["ma_name"]."</a>"
echo
"<li><a href='detalle-producto.php?id_modelo=".$row_e["id_modelo"]."'>".$row_e["mo_titulo"]."</a>"
    } else { 
echo
""
    }}} 
   echo
"</li></ul></div></li>";} 
    
   echo
"</ul> 
                </li>"
;} 
Pero como poseo que el nombre de la marca o ma_name esté dentro del while entonces cada vez que despliega el modelo genera la marca! o sea cai en el mismo problema de antes! pero si se quitan las marcas que no poseen modelos.

Con esta opción

Código PHP:
 $result_m=mysql_query("select * from t_marca WHERE id_subtipo=".$subtipo." ORDER BY id_marca",$linke); 
   while(
$row_m mysql_fetch_array($result_m)) { 
$desat=" "
if (
$row_m["id_marca"]=='4'){ $desat.="<img src='images/marca-1.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='5'){ $desat.="<img src='images/marca-2.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='6'){ $desat.="<img src='images/marca-3.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='7'){ $desat.="<img src='images/marca-4.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='8'){ $desat.="<img src='images/marca-5.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='9'){ $desat.="<img src='images/marca-6.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='10'){ $desat.="<img src='images/marca-7.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='11'){ $desat.="<img src='images/marca-8.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='12'){ $desat.="<img src='images/marca-9.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='13'){ $desat.="<img src='images/marca-10.png'  height='30' align='center'  border='0'/>"; } 
if (
$row_m["id_marca"]=='14'){ $desat.="<img src='images/marca-11.png'  height='30' align='center'  border='0'/>"; } 
          echo
"<li><a href='detalle-producto.php?id_modelo=".$row_m["ma_name"]."'>".$row_m["ma_name"]."</a>"
  
$marca=$row_m["id_marca"]; 
  
$result_e=mysql_query("select * from t_modelos WHERE  id_subtipo=".$subtipo." AND id_marca=".$marca." AND t_modelos.id_marca != 0 ORDER BY id_modelo ;",$linke)  or die( "Error en query: $linke, el error  es: " mysql_error() );   
        while (
$row_e mysql_fetch_array($result_e)){ 
        if(
$marca==$row_e["id_marca"]){ 
echo
"<li><a href='detalle-producto.php?id_modelo=".$row_e["id_modelo"]."'>".$row_e["mo_titulo"]."</a>"
    } else { 
echo
""
    }}} 
   echo
"</li></ul></div></li>";} 
    
   echo
"</ul> 
                </li>"
;} 
me deja las marcas cargadas asi no tengan modelo... La unica solucion que veo es que cada vez q se cargue un modelo se cargue la marca, pero no es util.

Etiquetas: registros
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 13:12.