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

Gooup By and Order.

Estas en el tema de Gooup By and Order. en el foro de Mysql en Foros del Web. Buenas, Necesito orientacion en el siguiente caso: Tengo una tabla llamada BUSQUEDAS con los siguientes campos: busquedas - ID - FECHA - TEXTO Resulta que ...
  #1 (permalink)  
Antiguo 31/08/2010, 17:33
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Gooup By and Order.

Buenas,
Necesito orientacion en el siguiente caso:

Tengo una tabla llamada BUSQUEDAS con los siguientes campos:

busquedas
- ID
- FECHA
- TEXTO


Resulta que en un buscador cada vez que hago una busqueda guardo la palabra que se ha buscado y la fecha. El ID es autoincrement.

Cuando muestro los resultados tambien muestro un historial de las ultimas 10 palabras buscadas.

Mostrarlo es facil, un simple SELECT, pero el problema viene cuando la persona busca por ejemplo y sale la siguiente lista:

SELECT TEXTO FROM busquedas ORDER BY FECHA DESC LIMIT 10

Tenis
Jamon
perro
Lapiz
Jamon
Tenis
Martillo
Juan
Tenis


Como veis se repite varias veces tenis o jamon. Me gustaria que solo se viese el ultimo tenis buscado, o el ultimo jamon....

Por ejemplo si hago un group by tampoco funciona por que agrupa por el primero que ve en la tabla, no por el ultimo que se ha metido :S
SELECT TEXTO FROM busquedas GROUP BY TEXTO ORDER BY FECHA DESC LIMIT 4

¿Alguna idea?

Gracias.
  #2 (permalink)  
Antiguo 31/08/2010, 17:47
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Respuesta: Gooup By and Order.

distinct.

select distinct campo from tabla.
  #3 (permalink)  
Antiguo 31/08/2010, 19:01
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Gooup By and Order.

Hola Claudio, el distinct me hace lo mismo que el group, no me ordena como deseo.
Mirando unos scripts he visto algo, realmente no acabo de entenderlo bien, pero he sabiado que me serviria y realmente va de perfecto:

SELECT TEXTO, max(FECHA) AS maxfecha FROM busquedas GROUP BY TEXTO ORDER BY maxfecha DESC LIMIT 10

Gracias
  #4 (permalink)  
Antiguo 01/09/2010, 03:28
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, 4 meses
Puntos: 2658
Respuesta: Gooup By and Order.

Cita:
Hola Claudio, el distinct me hace lo mismo que el group, no me ordena como deseo.
Mirando unos scripts he visto algo, realmente no acabo de entenderlo bien, pero he sabiado que me serviria y realmente va de perfecto:
El ORDER BY y el GROUP BY van an un único orden, lo que a tí te causa problemas. Para que te ordene de una forma determinada y luego te lo agrupe, no los puedes usar en la misma sentencia, sino hacer una sentencia anidada:
Código MySQL:
Ver original
  1. SELECT Texto, maxfecha
  2.     (SELECT
  3.         TEXTO,
  4.         MAX(FECHA) maxfecha
  5.     FROM busquedas
  6.     ORDER BY maxfecha DESC) T1
  7. GROUP BY TEXTO
  8. LIMIT 10;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 01/09/2010, 07:25
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Gooup By and Order.

gnzsoloyo me cuesta aprender esto pero al final voy a memorizar las cosas bien sin querer ^^
Lo que no entiendo es que diferencia hay en cuanto a rendimiento en tu solucion y en la que encontré un mensaje mas arriba. Mi forma de pensar dice: 1 consulta + 1 anidada VS 1 consulta... pero seguramente la tuya sea mucho mas optima y me gustaria saber por que.

Muchas gracias.
  #6 (permalink)  
Antiguo 01/09/2010, 07:45
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Gooup By and Order.

gnzsoloyo he probado tu ejemplo y solo me devuelve un registro, aun asi si hay alguna forma de que muestre el limit bien seria alucinante!
He hecho las consultas en la consola, tanto la tuya como la mia (Aunque la tuya no de el valor correcto aun)
La mia tarda 0.16 Segs.
La tuya 0.01 segs.



Otro problema que tengo con tu consulta es que utilizo un campo llamado ID_USUARIO, que antes en la duda no habia puesto para no meter paja, y que lo utilizo para saber que usuario es el que busca cada palabra, es decir que la consulta es:

Código SQL:
Ver original
  1. SELECT TEXTO, maxfecha
  2.       FROM
  3.           (SELECT
  4.               TEXTO,
  5.               MAX(FECHA) maxfecha
  6.           FROM busquedas
  7.           WHERE ID_USUARIO=$id_usuario
  8.           ORDER BY maxfecha DESC) T1
  9.       GROUP BY TEXTO
  10.       LIMIT 10

Con lo que cuando le paso un id de usuario que no ha hecho busquedas aun me sale el siguiente error: #1048 - Column 'TEXTO' cannot be null

Supongo que es por que no se crea el campo TEXTO y no puede agruparlo.

Un saludo.
  #7 (permalink)  
Antiguo 01/09/2010, 11:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Gooup By and Order.

He creado una tabla usuarios con los campos id_usuario y nombre, para mostrarte que puedes traértelo.

SELECT u.nombre, t3.texto, t3.fecha from usuarios u INNER JOIN (select b.id_usuario,t2.texto, t2.fecha from busquedas b inner join(select t1.texto, t1.fecha FROM(SELECT texto,fecha from busquedas order by fecha desc)t1 GROUP BY t1.texto)t2 on b.texto=t2.texto AND b.fecha = t2.fecha GROUP BY texto ORDER BY t2.fecha DESC, t2.texto)t3 ON t3.id_usuario = u.id_usuario ORDER BY t3.fecha DESC LIMIT 10

En esta consulta primero muestro texto y fecha ordenados por fecha descendente (es t1); luego tomo texto y fecha agrupando por texto, con lo que las palabras repetidas me las elimina; uno con la tabla búsquedas por los campos texto y fecha para traerme el id_usuario, y luego agrupo por fecha, para el caso de que dos personas escriban la misma palabra en la misma fecha y esta sea de las últimas (ahí pierdo un dato, pues sólo podré mostrar el id de uno de ellos, pero eso no tendrá importancia); de ese modo puedo traerme el nombre del usuario; luego ordeno descendente por fecha y hago el limit.

Etiquetas: order
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 10:33.