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
  • 0

Ordenar lista por fecha (PHP MySQL)

Hola chicos,

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
  • 0
  • 1Calificación
  • 0Seguidores
  • 412Visitas
  • 0Favoritos

18 respuestas

@ItsukiMinami dijo Hace más de 4 meses:

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.

@fullvice dijo Hace más de 4 meses:

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) ?

@fullvice dijo Hace más de 4 meses:

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 ?

@fullvice dijo Hace más de 4 meses:

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" ?

@fullvice dijo Hace más de 4 meses:

debe estar mal porque pusiste

SELECT * FROM ( TODOS LOS UNION ) ORDER BY fecha DESC

y 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())

@Samu22 dijo Hace más de 4 meses:

fullvice dijo:

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&aacute;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:
dijo:

Consulta inválida :



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

@ItsukiMinami dijo Hace más de 4 meses:

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."'

@Samu22 dijo Hace más de 4 meses:

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

@ItsukiMinami dijo Hace más de 4 meses:

si pero en este caso tenemos la fecha relacionada, por eso la sugerencia

@nicoshaggy dijo Hace más de 4 meses:

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

@nicoshaggy dijo Hace más de 4 meses:

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&aacute;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

Tienes que ser miembro para responder en este tema