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

ordenar por id DESC

Estas en el tema de ordenar por id DESC en el foro de Mysql en Foros del Web. estimados, tengo esta consulta que -- quisiera me devuelva el ultimo mensaje enviado por cada usuario -- Código PHP: SELECT  * FROM mensajes INNER JOIN usuarios ON usuarios . id  ...
  #1 (permalink)  
Antiguo 28/05/2009, 10:52
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
ordenar por id DESC

estimados, tengo esta consulta que -- quisiera me devuelva el ultimo mensaje enviado por cada usuario --

Código PHP:
SELECT *
FROM mensajes
INNER JOIN usuarios ON usuarios
.id mensajes.id_usuario_envia
WHERE mensajes
.id_usuario_recibe 1
GROUP BY mensajes
.id_usuario_envia
ORDER BY mensajes
.id DESC 
por alguna razon no me esta devolviendo el ultimo mensaje de cada usuario sino el primero... y eso que le puse ORDER BY id DESC pero bueh..

la estructura es esta

usuarios
.id
.nombre

mensajes
.id
.id_usuario_envia
.id_usuario_recibe
.mensaje

que me esta faltando??
__________________
On error no hago nada porque deje de fumar...
  #2 (permalink)  
Antiguo 28/05/2009, 12:19
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ordenar por id DESC

Con order by mensajes.id_usuario_envia asc que resultado tienes?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 28/05/2009, 12:57
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

sigue mostrandome el primer mensaje de cada usuario
solo que ahora me ordena por usuario ascendente osea el usuario mas viejo al principio
que puede ser?
"VVaayyaa tteeccllaaddoo mmaass sseennssiibbllee" <--- muy bueno! jjaa
__________________
On error no hago nada porque deje de fumar...
  #4 (permalink)  
Antiguo 28/05/2009, 13:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ordenar por id DESC

Guardas alguna fecha para tratar de ordenar el mensaje por la ultima fecha que mandó el mensaje?

en el where mensajes.id_usuario_recibe = 1

cuantos mensajes cumplen esta condición?

Si solo la cumple uno... casualmente, este registro no está vinvulado con el primer mensaje y no con el ultimo?

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 28/05/2009, 16:55
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

puse id_usuario_recibe = 1 para hacer una prueba
y que me devuelva todos los (ultimos mensajes) de todos los usuarios que me escribieron
si tiene un campo fecha, pero creo que con el id es suficiente
a mas alto el id mas nuevo el mensaje ;)

mas de un mensaje cumple con esa condicion pero me muestra el primer mensaje y no el ultimo, pense en hacer subconsultas pero.. me pasa exactamente lo mismo
__________________
On error no hago nada porque deje de fumar...
  #6 (permalink)  
Antiguo 29/05/2009, 01:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ordenar por id DESC

Dieguicho,
a ver si hay suerte con esto. Yo no lo he probado:
Código sql:
Ver original
  1. SELECT me.id, me.id_usuario_envia, me.id_usuario_recibe FROM mensajes me INNER JOIN
  2.    (SELECT m.id_usuario_envia USUARIO, MAX(m.id) ULTIMO FROM mensajes m
  3.      GROUP BY m.id_usuario_envia)t1 ON me.id = t1.ULTIMO AND t1.USUARIO = me.id_usuario_envia

Luego te tocará cruzar este resultado con la tabla usuarios para averiguar los nombres de ambos usuarios.
  #7 (permalink)  
Antiguo 29/05/2009, 13:30
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

upa.. ahi parece que anda... medio lenteja pero anda...

SELECT me.id message_id, me.id_usuario_envia user_id, usuarios.usuario username, me.mensaje body, me.fecha date, usuarios.foto photo, me.is_readed
FROM mensajes me
INNER JOIN (

SELECT m.id_usuario_envia USUARIO, MAX( m.id ) ULTIMO
FROM mensajes m
WHERE m.id_usuario_recibe = 1 AND m.to_user_status = 0
GROUP BY m.id_usuario_envia
)t1 ON me.id = t1.ULTIMO
AND t1.USUARIO = me.id_usuario_envia
INNER JOIN usuarios ON usuarios.id = me.id_usuario_envia AND usuarios.estado = 0
ORDER BY me.id DESC

si se les ocurre algo para optimizarlo mejor sino con esto.. (por ahora me arreglo)
gracias!!!
__________________
On error no hago nada porque deje de fumar...
  #8 (permalink)  
Antiguo 29/05/2009, 13:59
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: ordenar por id DESC

Volvamos a las fuentes. ¿Esto funciona?:
Código sql:
Ver original
  1. SELECT *
  2. FROM (SELECT *
  3.    FROM mensajes INNER JOIN usuarios ON usuarios.id = mensajes.id_usuario_envia
  4.    ORDER BY mensajes.id DESC) T1
  5. GROUP BY id_usuario_envia;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 29/05/2009, 16:01
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

exactamente como la pusiste no...
la modifique un poco y si...

FROM (

SELECT mensajes.id, usuarios.usuario, usuarios.id user_id, mensajes.mensaje body
FROM mensajes
INNER JOIN usuarios ON usuarios.id = mensajes.id_usuario_envia
WHERE mensajes.id_usuario_recibe = 1
ORDER BY mensajes.id DESC
)T1
GROUP BY user_id

pero sigue sin mostrarme el ultimo mensaje enviado por cada usuario
__________________
On error no hago nada porque deje de fumar...
  #10 (permalink)  
Antiguo 29/05/2009, 16:02
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

si le saco el GROUP BY user_id
me muestra todos los mensajes de todos los usuarios ordenados por id descendente
solamente faltaria agrupar los usuarios. es ahi cuando falla :(
__________________
On error no hago nada porque deje de fumar...
  #11 (permalink)  
Antiguo 29/05/2009, 16:20
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: ordenar por id DESC

Si te los muestra en orden descendente cronológicamente, entonces el orden está bien, solamente habría que poner el agrupamiento en el campo correcto (usuario, por ejemplo).
Sería: Ordenar pos usuario ascendente y mensaje descendente, y luego el resultado agruparlo por usuario
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 29/05/2009, 16:27
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

masomenos..
agrupar por mensaje DESC
y el ordenamiento por usuario no tiene sentido ya que siempre los mensajes nuevos van arriba

imaginate gmail..
ves que te arma el hilo de conversaciones pero cuando te fijas en el inbox ves el ultimo mensaje arriba de todo

como hago el agrupamiento por usuario correcto? porque al agruparlo pierdo el precioso orden DESC
__________________
On error no hago nada porque deje de fumar...
  #13 (permalink)  
Antiguo 29/05/2009, 16:54
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: ordenar por id DESC

Cita:
como hago el agrupamiento por usuario correcto? porque al agruparlo pierdo el precioso orden DESC
El sentido del agrupamiento es dejar sólo un registro por cada usuario, acompañado por el ID del último mensaje. Nada más.
¿Es eso lo que estás tratando de obtener o qué otra cosa?
Cita:
agrupar por mensaje DESC
y el ordenamiento por usuario no tiene sentido ya que siempre los mensajes nuevos van arriba
Si el identificador de los mensajes no realiza el agrupamiento en la tabla de los diferentes usuarios, entonces se necesita también ese ordenamiento.
La idea es que si al ordenar los ID de los mensajes entre varios de un usuario aparece uno de otro usuario, se requiere también el usuario en el ORDER BY; Pero si quedan separados no.
Si ese orden funciona bien, el agrupamiento por usuario debería dejarte solamente los últimos en ser enviados. ¿Por qué dices que no lo hace?
¿Podrías postear una imagen del resultado del ordenamiento y otra del agrupamiento?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 29/05/2009, 20:57
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

la consulta funciona bien
me devuelve

id usuario mensaje
3 javi chau
2 javi hola
1 mari hola como estas

pero cuando le aplico el GROUP BY me devuelve
id usuario mensaje
2 javi hola
1 mari hola como estas

fijate que mensaje "hola" de javi enrealiad deberia ser el mensaje "chau" con id 3

ya me he salido del sitio original y me cree una base tna simple como lo que acabo de exponer para poder ir probando, pero pincha cuando agrupo :(
gracias por tu ayuda
__________________
On error no hago nada porque deje de fumar...
  #15 (permalink)  
Antiguo 29/05/2009, 21:20
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

basandome en tu ultima consulta y agregando un nuevo ORDER si funciona.
pero.. deberia estar mas optimizado.. esta ordenando dos veces.

id_usuario_recibe = 1 esta asi porque lo pruebo para que me devuelva todos los mensajes que recibió el usuario con id = 1

Código PHP:
SELECT mensajes.idmensajes.id_usuario_enviausuarios.usuariomensajes.mensaje
FROM mensajes
INNER JOIN usuarios ON usuarios
.id mensajes.id_usuario_envia
WHERE mensajes
.id_usuario_recibe 1
ORDER BY mensajes
.id DESC
)T1
GROUP BY id_usuario_envia
ORDER BY id DESC 
__________________
On error no hago nada porque deje de fumar...
  #16 (permalink)  
Antiguo 29/05/2009, 23:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ordenar por id DESC

La consulta de gnzsoloyo es más eficiente, eso está claro, porque el group by se aplica a los registros cruzados previamente con INNER JOIN (se ha hecho uso de los índices), ya están ordenados y te traes los datos necesarios, por lo que es GROUP posterior es mucho más eficiente; por contra en el otro caso, el del MAX(), que propuse yo, se hace necesario comparar todos los registros y sólo puedes traerte dos datos, lo que obliga a otro cruce.
Aplaudo la solución
Dieguicho, ahora sólo quedaría traerte el nombre de usuario de la persona que recibió el envío: eso te obliga a un autojoin dentro de la primera con algo así:
Código sql:
Ver original
  1. SELECT t1.id, t1.id_usuario_envia, t1.usuario, t1.id_usuario_recibe, t1.receptor FROM (SELECT mensajes.id, mensajes.id_usuario_envia, usuarios.usuario, id_usuario_recibe, usuarios2.usuario receptor, mensajes.mensaje
  2. FROM mensajes
  3. INNER JOIN (usuarios usuarios, usuarios usuarios2) ON usuarios.id = mensajes.id_usuario_envia AND usuarios2.id=mensajes.id_usuario_recibe
  4. ORDER BY mensajes.id DESC
  5. )T1
  6. GROUP BY id_usuario_envia ORDER BY t1.id DESC
Yo, al menos, todos los días aprendo algo con gnzsoloyo.
Dieguicho, una aclaración final: esto es sólo si quieres traerte los nombres del que envía y recibe; si no es necesario, déjalo como lo tenías, porque esto (el ir dos veces a la misma tabla) ralentizará la consulta.

Última edición por jurena; 30/05/2009 a las 04:35
  #17 (permalink)  
Antiguo 06/06/2009, 09:30
Avatar de dieguicho  
Fecha de Ingreso: noviembre-2001
Ubicación: Buenos Aires
Mensajes: 1.190
Antigüedad: 22 años, 5 meses
Puntos: 1
Respuesta: ordenar por id DESC

exacto jurena
no necdesito saber el nombre del destinatario.. solo su id que lo obtengo con id_usuario_recibe
gracias a todos!!!
__________________
On error no hago nada porque deje de fumar...
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 02:15.