Comunidad oficial de diseñadores web, web developers y Webmasters. Aqui podemos tratar temas actuales sobre diseño y tecnología. Podemos compartir y actualizarnos. Photoshop, Flash, PHP, ASP, Java, HTML, CSS, MySQL, CMS, etc. Unite YA y lee los Sticky
Ver más- 13,065 Miembros
- 9,531 Temas
- 3,449 Seguidores
Ordenar lista por fecha (PHP MySQL)
Vengo nuevamente con una interrogante...
Tengo 5 tablas en las cual sé unirlas con UNION ALL, y me gustaria juntarlas para mostrar el contenido de las 5 listas en una sola lista, ordenada por la fecha mas reciente... El problema que tengo es que las fechas las guardo en formato timestamp (ese formato de 10 digitos numericos).
¿¿Alguien sabe como hacer esto??
Gracias de ante mano

- 1Calificación
- 0Seguidores
- 412Visitas
- 0Favoritos
Global
Argentina
Chile
Colombia
España
México
Perú
Uruguay
Venezuela
18 respuestas
pues igual el timestamp sigue siendo un numero que aumenta los puedes ordenar igualmente de mayor a menor o viceversa, el problema seria que el campo de fecha se llame igual para todas las tablas.
Si todas las tablas tienen el mismo nombre de campo en comun "fecha"...
¿Sabes como hacer la consulta?
Entonces me parece que le estas errando a la forma de tus tablas... sabes lo que es una base de datos relacional ? o por lo menos un FK (Foreing Key) ?
la base datos racional es la union durante una relación en comun de campos, en mi caso los unicos campos en comun son: nick, fecha, id
si tenes problemas con la fecha porque todos se llaman iguales, porque no haces un "group by fecha" al final ? y que cosas estas uniendo ?
Te explico... Tengo mi sitio web con una tabla para cada sección, entonces quiero hacer una opcion en la que se muestren todas las descargas en una sola lista, y como ya no puedo usar id ya que algunas secciones tienen ids mayores que otros no se van a ordenar por orden de posteo, entonces por fecha seria lo mas conveniente para ordenarlas...
Y pues eso es lo que necesito hacer, unir las 5 tablas y mostrar su contenido por orden de fecha
mira, no te entendi bien como hiciste las tablas, si pusieras algo como:
--------------------------------
| id | fecha | link |
| 1 | 15489 | google |
--------------------------------
pero no te funciona un "ORDER BY fecha DESC" ?
mira te indico el codigo que estoy usando:
<?
include("conexion.php") ;
$pegar = "SELECT * FROM (
select * from audio
union all
select * from video
union all
select * from imagen
union all
select * from otros
) ORDER BY fecha DESC";
$cad = mysql_db_query($db,$pegar) or die ("Consulta inválida : $sql");
while ($row = mysql_fetch_array($cad)) {
?>
aqui se supone que van los resultados, pero que hacer si tengo campos con distintos nombres
<?
}
?>
el problema que me surge es este:
debe estar mal porque pusiste
SELECT * FROM ( TODOS LOS UNION ) ORDER BY fecha DESCy no podes poner FROM (algo).
pone directamente el primer select con su union, etc, y al final de todo order by.
si te sige tirando error, pone en ves de
die("consulta invalida")pone
die(mysql_error())me dice:
Linea 4: include("conexion.php"
Lo usé de esta forma:
<?
include("conexion.php") ;
$pegar = "SELECT * FROM (audio union all video union all imagen union all otros) ORDER BY fecha DESC";
$cad = mysql_db_query($db,$pegar) or die(mysql_error());
while ($row = mysql_fetch_array($cad)) {
?>
:/
Esta mal la consulta el UNION ALL se utiliza para unir dos grupos de resultados
por ejemplo:
(SELECT titulo, fecha , ('articulo') AS type FROM articulos LIMIT 10)
UNION ALL
(SELECT titulo, fecha, ('blog') FROM blogs LIMIT 10)
UNION ALL
(SELECT titulo, fecha, ('noticia') FROM noticias LIMIT 10)
ORDER by titulo DESC
Otra cosa fundamental para que funcione el UNION ALL es que la cantidad de campos que devuelvan los select debe ser la misma, si estas haciendo un select * en todas las tablas y una tiene mas o menos campos que cualquiera de las otras la consulta es invalida, al igual que el tipo de campo que estes queriendo comparar, aunque con algunas excepciones, es posible que puedas unir campos de tipo date con datetime y timestamp, pero no un campo varchar con un int
no has probado a hacer un left join?
osea algo del tipo
como esto es un ejemplo de vbulletin pero creo que se aplica igual cambiando obviamente las variables unicas que tiene vbulletin de ahi puedes ordenarlo por el campo que quieras:
SELECT media.*, media_service.*, media_category.*, IF(NOT ISNULL(user.userid), user.username, media.username) AS username
FROM " . TABLE_PREFIX . "media AS media
LEFT JOIN " . TABLE_PREFIX . "media_service AS media_service ON(media_service.serviceID = media.serviceID)
LEFT JOIN " . TABLE_PREFIX . "media_category AS media_category ON(media_category.categoryID = media.categoryID)
LEFT JOIN " . TABLE_PREFIX . "user AS user ON(user.userid = media.userID)
WHERE media.mediaID = '".$mid."'
el JOIN es distinto a un UNION, con el JOIN agrupas datos segun alguna coincidencia, el UNION crea una tabla temporal con los datos equivalentes, por ejemplo en caso de algun buscador podes unir 3 tablar y filtrarlas sin que tengan que tener una relacion, en el caso de buscar la palabra "faso" en articulos, blogs, y noticias, con un left join si no tenes datos relacionados no lo podes hacer
si pero en este caso tenemos la fecha relacionada, por eso la sugerencia
Algo asi como Taringa en vivo: http://www.taringa.net/envivo/
obviamente no que se actualize en tiempo real, pero si que se muestre lo ultimo publicado cada ves que ingrese a la pagina.
Si las 4 tablas guardan los "mismos" datos es al pedo tenerlas porque podrías haber simplificado todo en una sola agregando solamente una columna para indicar su tipo o categoría.
Ejemplo:
--------------------------------
| id | fecha | titulo | tipo |
| 1 | 20120125 | Descaga el disco de mi banda | audio |
| 2 | 20120125 | Videos divertidos | video |
--------------------------------
Si sigues con las 4 tablas prueba si no lo resolviste:
(SELECT fecha FROM audio LIMIT 10)
UNION ALL
(SELECT fecha FROM video LIMIT 10)
UNION ALL
(SELECT fecha FROM imagen LIMIT 10)
UNION ALL
(SELECT fecha FROM otros LIMIT 10)
ORDER BY fecha DESC
¿como hago el echo?
ese es mi problema, porque en audio el campo se llama "nombreaudio", y lo mismo para video, imagen y otros...
include("conexion.php") ;
$pegar = "
(SELECT fecha, FROM audio LIMIT 10)
UNION ALL
(SELECT fecha FROM video LIMIT 10)
UNION ALL
(SELECT fecha FROM imagen LIMIT 10)
UNION ALL
(SELECT fecha FROM otros LIMIT 10)
ORDER BY fecha DESC
";
$cad = mysql_db_query($db,$pegar) or die ("Consulta inválida : $sql");
while ($row = mysql_fetch_array($cad)) {
# Aca muestras los resultados.
# Los puedes mostrar con el nombre de la columna
echo $row["fecha"];
# O la posicion de la columna con un número empezando siempre con el cero.
echo $row[0];
echo $row[1];
}
Si nombreaudio, nombrevideo, etc están en la misma posición te serviría mostrarlo con numero, con esto me refiero a:
--------------------------------| id | fecha | nombreaudio |
| 1 | 20120125 | Descaga el disco de mi banda |
--------------------------------
| id | fecha | nombrevideo |
| 1 | 20120125 | Descaga el video de mi banda |
| 2 | 20120125 | Videos divertidos |
--------------------------------
id seria 0
fecha seria 1
nombreaudio/nombrevideo seria 2