Relacionar tablas (insertar, seleccionar y mostrar)
buenas!
desde ya muchas gracias para todos lo que se tomen el tiempo de pasar por aqui =)
resulta que estoy intentando crear un administrador de noticias para la cual necesito que por cada noticia se pueda insertar varias fotos...
tengo estas dos tablas:
TABLE `news` (
`ID_NOTICIA` int(11) NOT NULL AUTO_INCREMENT,
`TITLE_1` varchar(256) DEFAULT NULL,
`DATE` date DEFAULT NULL,
`TITLE_2` varchar(256) DEFAULT NULL,
`BODY` text DEFAULT NULL,
`LINK_OUT` varchar(256) DEFAULT NULL,
`LINK_NAME` varchar(256) DEFAULT NULL,
PRIMARY KEY (`ID_NOTICIA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
TABLE `archivos` (
`id_archivo` int(11) NOT NULL AUTO_INCREMENT,
`id_news` int(11) NOT NULL,
`tipo_archivos` varchar(11) DEFAULT NULL,
`id_tipo_archivos` int(11) DEFAULT NULL,
`nombre_archivos` varchar(255) DEFAULT NULL,
`archivo_archivos` varchar(255) DEFAULT NULL,
`extension_archivos` varchar(255) DEFAULT NULL,
`portada_archivos` int(11) DEFAULT NULL,
`fecha_archivos` datetime DEFAULT NULL,
PRIMARY KEY (`id_archivo`),
KEY `id_news` (`id_news`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
estos son los INSERT de las tablas:
$insertSQL = sprintf("INSERT INTO archivos (tipo_archivos, nombre_archivos, archivo_archivos, extension_archivos, fecha_archivos) VALUES ( %s, %s, %s, %s, NOW())",
$insertSQL = sprintf("INSERT INTO news (ID_NOTICIA, DATE, TITLE_1, TITLE_2, BODY, IMG, LINK_OUT, LINK_NAME) VALUES (%s, NOW(), %s, %s, %s, %s, %s, %s)",
y esta es la consulta:
$query_Recordset1 = "SELECT news.*,archivos.* FROM news LEFT JOIN archivos ON news.ID_NOTICIA = archivos.id_news WHERE archivos.tipo_archivos = 'general' ORDER BY DATE";
lo que sucede es que me muestra duplicada la noticia tantas veces como fotos coincidan con la relación
que es lo que me falta o que estoy haciendo mal ¿?
Muchas Gracias
saludos!
blublu
te estaría muy agradecida si me pudieras dar una mano!
bueno de todas maneras ya lo has echo
yo mientras sigo intentando, porque aun no lo eh logrado :(
Salut!
phpninja
Si no tienes forma de aplicar estos cambios,
en cuanto tenga un momentillo, te lo miro.
blublu
ah lo olvidaba.. con esto obtengo el $row_Recordset1 :
$Recordset1 = mysql_query($query_Recordset1, $conexion) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
salut!
blublu
huf, pensé que seria mas fácil resolver algo que en la lógica es tan simple....
llevo tiempo intentando resolverlo, y aunque sea la primera vez que publico en un foro, podría asegurar que me eh leído casi todos!
bien, entonces voy a probar lo que me dices de hacer dos query
lo que no estoy segura es como mostrarlos
yo tengo esto que imprime en pantalla:
<?php if ($totalRows_Recordset1> 0) { // Show if recordset not empty ?>
<ul class="hoverbox">
<?php do { ?>
<li><?php echo $row_Recordset1['TITLE_1']; ?>
<?php echo $row_Recordset1['DATE']; ?>
<?php echo $row_Recordset1['TITLE_2']; ?>
<?php echo $row_Recordset1['BODY']; ?></li>
<li><p><a href="imagenes/<?php echo $row_Recordset1['archivo_archivos']; ?>" class="imagen_grande">
<img src="img.php?file=imagenes/<?php echo $row_Recordset1['archivo_archivos']; ?>&amp;ancho=100&amp;alto=75&amp;cut" alt="<?php echo $row_Recordset1['nombre_archivos']; ?>" height="100" width="75"></a></p>
<p><a href="include/borrar.php?id=<?php echo $row_Recordset1['id_archivo']; ?>" onclick="javascript: if(!confirm('&#191;Est&#225; seguro?')) return false;">borrar</a></p></li>
<li> <?php echo $row_Recordset1['LINK_OUT']; ?>
<?php echo $row_Recordset1['LINK_NAME']; ?></li><br /><br />
<?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
</ul>
<?php
} // Show if recordset not empty
?>
<?php
mysql_free_result($Recordset1);
?>
donde $row_Recordset1 vale para todas las filas
si hago dos query deberían imprimirse por separado $row_Recordset1 con las filas de por ejemplo la tabla news
y luego $row_Recordset2 con las filas de la tabla archivos, pero como logro relacionar las id para que se imprima todo junto?
bueno muchas gracias nuevamente phpninja y por la paciencia =)
mis conocimientos sobre este tema son muy básicos...
phpninja
A ver vale, acabo de echarle un repaso. De hecho está bien, porque te manda rows duplicadas de news, tantos como la cantidad de archivos que existen para cada notícia.
- O cambias el query, haciendo solo el de news, y una vez estás recorriendo cada new, hacer otro query para llamar a los archivos.
- O haciendo un filtrado en cuanto lo muestras para que solo imprima news no repetidas.
porque creo que SQL te está dando la info correcta. El recordSet resultante, no puede llegarte a darlo algo del royo [info new,....] [archivo1][archivo2] ...
esto no te lo podrá sacar facilmente.
suerte
blublu
Muchas Gracias por la respuesta phpninja!
eh puesto el mismo nombre para para el campo id_noticia en ambas tablas
TABLE `archivos` (
`ID_NOTICIA` int(11) NOT NULL,
TABLE `news` (
`ID_NOTICIA` int(11) NOT NULL AUTO_INCREMENT,
y modifique la consulta utilizando USING
$query_Recordset1 = "SELECT news.*,archivos.* FROM news JOIN archivos USING(ID_NOTICIA) ORDER BY DATE";
pero sigue mostrando los mismos resultados :(
tendrá algo que ver la manera en la que lo muestro en pantalla?
o quizás tengo que relacionar las tablas desde phpMyAdmin?
phpninja
Deberias tener el mismo nombre para el campo id_noticia en las dos tablas.
Y usar un JOIN archisvos using id_noticia.
Ahora se te duplican por el left join, y porque la manera de relacionar las dos tablas no es del todo correcta, ya que la consulta tiene que mirar en todos los rows, por eso salen duplicados.