Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ordenar dos tablas por campos de fecha

Estas en el tema de Ordenar dos tablas por campos de fecha en el foro de Mysql en Foros del Web. Hola a todos, les sigo desde hace tiempo y me gusta mucho la faena que hacen, no me gusta mucho preguntar ya que siempre busco ...
  #1 (permalink)  
Antiguo 25/06/2012, 03:24
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Ordenar dos tablas por campos de fecha

Hola a todos, les sigo desde hace tiempo y me gusta mucho la faena que hacen, no me gusta mucho preguntar ya que siempre busco y encuentro lo que no puedo solucionar por mi mismo, pero esta vez no ha sido así. El tema está en una consulta mysql con el framework codeIgniter, que por lo que he visto tiene problemas para usar union y debo hacerlo con join, tengo 2 campos, uno en la tabla comentarios y otro en la tabla posts y están relacionados por un campo llamado id en la tabla posts e id_post en la tabla comentarios, despues tengo otro campo en cada tabla de fechas en posts es fecha y en comentarios fecha_c, y lo que quiero es unir los campos y que ordene por desc los campos fecha, espero haber sido bastanta claro y que se me haya entendido, dejo la consulta para que sea más sencillo de comprender, saludos y muchas gracias.
Código MySQL:
Ver original
  1. select p.id,p.titulo,p.autor,p.cuerpo,p.categoria,p.fecha,c.fecha_c from
  2. posts as p left join comentarios as c on c.id_post=p.id group by id order by p.fecha desc,c.fecha_c desc
PD:Siempre me ordena por el primer campo que le digo, en esta caso p.fecha desc.
  #2 (permalink)  
Antiguo 25/06/2012, 04:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar dos tablas por campos de fecha

El problema está en el uso del GROUP BY con ORDER BY.
Como GROUP BY opera antes que ORDER BY, primero realiza el agrupamiento, dejando el primer registro que encuentre de cada grupo, por lo que posiblemente no logres el conjunto de registros que buscas.
Eso se soluciona habitualmente por medio de una subconsulta, y dejando el GROUP BY en la externa
Código MySQL:
Ver original
  1. SELECT ....
  2. FROM (SELECT ... FROM ... ORDER BY ...) TablaDerivada
En este tipo de consultas la consulta interna es la que selecciona los datos conforme las condiciones que se desean. La externa sirve sólo para agrupar y darle el orden definitivo.
Ahora bien, si de cada grupo quieres el valor mayor de la fecha, lo más simple es usar MAX():
Código MySQL:
Ver original
  1.     p.id,
  2.     p.titulo,
  3.     p.autor,
  4.     p.cuerpo,
  5.     p.categoria,
  6.     MAX(p.fecha) fecha,
  7.     MAX(c.fecha_c) fecha_C
  8.     posts p
  9.     LEFT JOIN comentarios c ON c.id_post=p.id
  10. ORDER BY p.fecha desc,c.fecha_c desc

Lo que me resulta muy extraño es que un FW no acepte el UNION. Eso es MUY raro, porque es parte del estandar.
¿Verificaste en el manual de referencia del FW?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/06/2012, 04:31
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Ordenar dos tablas por campos de fecha

Muchas gracias por la respuesta, la verdad que te ajustaste mucho a la solución, pero aún así el campo fecha_c de la tabla comentarios me los ordena pero me sigue dejando resultados hundidos no sé por que, pero la verdad que mejoro mucho la consulta, y lo que me comentas, tengo el manual del framework y he estado mirando bastante lo que me comentas antes de postear, y sin saber porque, hay soluciones(apaños) para utilizar el union, pero no la trae como otras, ejemplo, esto en el FW codeigniter funciona
Código PHP:
Ver original
  1. $this->db->order_by(campo)
Esto otro también funciona
Código PHP:
Ver original
  1. $this->db->group_by(campo)
En cambio union o union all no existe, se ve que hay varias formas de llegar a utilizarlo, pero para mi proposito con join me sirve, sigo mirando a ver si puedo subir esos resultados del campo fecha_c y muchisimas gracias por su tiempo y muy amable.
  #4 (permalink)  
Antiguo 25/06/2012, 06:51
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Ordenar dos tablas por campos de fecha

Bueno, la verdad que he perdido demasiado tiempo con este tema(no tanto), y estoy muy agradecido por la ayuda ofrecida, la consulta me sirvio pero me dejó hundidos los temas que me interesan, así que finalmente, a sabiendas que con mucho tráfico puede pasar factura, y hasta que se me ocurra una nueva solución, al hacer la inserción de los comentarios y ordenarlos con la consulta que me ofrecieron voy a hacer tb un update a un campo fecha que no voy a utilizar más que para hacer ups, así siempre podre tener arriba los últimos posts y las últimas respuestas, me imagino que no será muy ortodoxo, pero si lo tuviera que hacer con php no tendría mayor problema, pero con codeIgniter es algo distinto el tema del sql, así que pongo este comentario por si alguién se encuentra con el problema que yo tengo que pueda tener otra alternativa más, saludos y muchas gracias de nuevo a todos los que hacen posible este foro.
  #5 (permalink)  
Antiguo 25/06/2012, 07:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar dos tablas por campos de fecha

Es posible que el tema ya no te interese, pero como colaboración para el resto de la gente que pueda encontrarse con el problema, me gustaría que aclararas algunos detalles:
- ¿A qué te refieres con que te deja los temas "hundidos"?
- ¿Qué menajes te devuelve el sistema cuando usas el framework, enviando una consulta con UNION?

Gracias.

PD: Trata de escribir mas calmado. Usa puntos aparte para separar as ideas, porque el texto termina siendo confuso ante la mezcla de cosas.
Nadie te cobrará por escribir más.
Sin ofender.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 25/06/2012, 08:28
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Ordenar dos tablas por campos de fecha

Hola de nuevo, el decir que me los deja hundidos es que me ordena sólo los temas con el primer campo del order by, con lo que al segundo no le hace 'caso', y con respecto a utilizar union no lo probé a fondo, pero puedo decir que es bastante distinto que con php, este es el estilo de la consulta que se debe realizar con codeIgniter.
Código PHP:
Ver original
  1. $query1 = $this->db->get('Example_Table1'); $join1 = $this->db->last_query(); $query2 = $this->db->get('Example_Table2'); $join2 = $this->db->last_query(); $union_query = $this->db->query($join1.' UNION '.$join2.' ORDER BY column1,column2);
Que quede claro que yo no soy experto en el lenguaje de las bases de datos, me defiendo y hasta ahora es mi primer problema, pero igualmente, al unir las tablas como se hizo con join no entiendo porque no me sube las fechas y me las ordena por igual ya que son campos con el mismo tipo de datos, solo me coge el primer campo de la claúsula order_by, algo bien extraño, si se necesita cualquier cosa en la que pueda colaborar dímelo que estaré al tanto, gracias y saludos.
  #7 (permalink)  
Antiguo 25/06/2012, 09:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar dos tablas por campos de fecha

Bueno, el problema del ordenamiento puede deberse al desconocimiento de cómo funciona el ORDER BY, lo cual debe ser parte del problema de no dominar las reglas básicas de SQL.
El mejor consejo que te puedo dar es que estudies por lo menos los conceptos básicos de las sentencias de SQL y sus modificadores (JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN, UNION, GROUP BY, ORDER BY, HAVING, etc.). Te vas a evtar problemas con estas cosas.
Es imperativo que las entiendas por lo menos en lo esencial para evitarte dolores de cabeza.
Por otro lado, ten en cuenta que decir que reemplazas un UNION por un JOIN, es lo mismo que reemplazar una suma por una multiplicación. Porque eso es lo que sucede. Y no son operaciones iguales, ni dan el mismo resultado.
El UNION es sumar una cantidad X1 de registros de un SELECT, con una cantidad X2 de otro SELECT.
La condiciones básicas del UNION son:
- Ambos SELECT deben devolver la misma cantidad de columnas.
- El orden de los datos debe ser el mismo, incluyendo especialmente el tipo de dato.
- Toda cláusula ORDER BY y GROUP BY puestas al final afectan a toda la tabla devuelta, sumados los resultados de ambos.
- UNION sin otra condición elimina registros duplicados (entendiendo por tales aquellos donde se repiten los mismos valores en TODAS las columnas comparadas).
- UNION ALL devuelve todos los registros, incluidos los duplicados.

En cuanto al ORDER BY, es jerárquico, y evalúa las columnas de izquierda a derecha.
Ordena primero por la primera columna, si y sólo si el valor de esa columna se repite, valores iguales de la primera se ordenan por la segunda columna.
En otras palabras:

Código MySQL:
Ver original
  1. A   1
  2. B   13
  3. C   2
  4. C   3
  5. C   56
  6. D   2
  7. E   98
  8. F   1
  9. F   23
  10. F   102

¿Se entiende?

Si los valores de la primera columna no se repiten, no tomará en cuenta las siguientes para el orden.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 25/06/2012, 09:32
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Ordenar dos tablas por campos de fecha

Hola y gracias de nuevo, tienes razón, no domino como debiera el sql y eso que me gusta mucho y hay que dominarlo por lo menos lo básico como bien dices, se me dá mejor la programación.
Pero de todos modos voy a tomarte la palabra muy en serio solo por la molestia que te has tomado y te pido me recomiendes un buen manual, sino ya lo buscaré, pero dada tu experiencía creo que puedes orientarme bastante mejor y más directo y me voy a quitar un problemilla, muchas gracias y como siempre muy amable, no me ofendo para nada, me agrada que me ayuden a mejorar, saludos.

Ya está, encontre éste enlace que creo me va a venir de perlas.

[URL="http://www.forosdelweb.com/f86/manuales-mysql-644680/"]http://www.forosdelweb.com/f86/manuales-mysql-644680"]http://www.forosdelweb.com/f86/manuales-mysql-644680/"]http://www.forosdelweb.com/f86/manuales-mysql-644680[/URL]
Muchas gracias de nuevo.

Última edición por israel965; 25/06/2012 a las 09:43

Etiquetas: campos, fecha, join, select, sql, tabla, tablas
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 09:51.