Problema montar un query
Publicado por kyo (8 intervenciones) el 01/08/2013 20:24:08
Llevo 4 días comiéndome la cabeza, a ver si logro explicarme. Tengo la siguiente tabla para una especie de servicio de mensajería:
[ id ] [ usuario_origen ] [ usuario_destino ] [ fecha ] [ mensaje ] [ visto_destino ]
Objetivo: QUIERO SACAR LOS ÚLTIMOS 10 ID CON LOS QUE HA CONTACTADO UN USUARIO.
Hay tres escenarios posibles:
- Usuario activo es receptor
- Usuario activo es emisor
- Usuario activo es receptor y emisor (en diferentes registros).
El problema es que el user activo puede estar en ambos lados ,usuario_origen y usuario_destino , pero desde que aparezca en uno de esos lados ya el otro usuario no debe volver a tenerse en cuenta!!!!
Condiciones: Sea fácil usar el LIMIT para ir haciendo búsquedas por bloques, los 10 últimos, los 20 últimos, ....
Actualmente tengo una solución que sabía que era 'mala' pero efectiva y resulta que no, es la siguiente:
1ª) Hago un conteo total de los ids únicos:
consulta_idsUnicos =" SELECT id FROM ".$tablabd_usuarios." WHERE id in
(SELECT usuario_origen
FROM ".$tablabd_mensajes."
WHERE usuario_destino = ".$id_usuario_activo." GROUP BY usuario_origen)
UNION
(SELECT usuario_destino
FROM ".$tablabd_mensajes."
WHERE usuario_origen = ".$id_usuario_activo." GROUP BY usuario_destino);";
2º) Uso ese total para añadir un LIMIT a la misma consulta y así conseguir los últimos:
1º] $comienzoLimit = $total_ids_unicos - $total_fichas_mostrar;
2º] $consulta_fichas = " SELECT id FROM ".$tablabd_usuarios." WHERE id in
(SELECT usuario_origen
FROM ".$tablabd_mensajes."
WHERE usuario_destino = ".$id_usuario_activo." GROUP BY usuario_origen)
UNION
(SELECT usuario_destino
FROM ".$tablabd_mensajes."
WHERE usuario_origen = ".$id_usuario_activo." GROUP BY usuario_destino)
LIMIT $comienzoLimit, $total_fichas_mostrar;";
PENSABA QUE LO TENÍA RESUELTO, mal resuelto pero resuelto, pero no. Lo que pasa es que tengo los ids ordenados por el PRIMER mensaje enviado y no por los últimos mensajes recibidos.
Así que me salen los últimos contactos NUEVOS que ha tenido el usuario y no los últimos contactos sean los que sean.
Si hay un usuario que le mandó un mensaje hace un mes y vuelve a enviar uno ahora mismo, este usuario no está posicionado en el último puesto sino que aparece ordenado cuando envió el primer mensaje hace un mes.
No sé si se pueden aprovechar las consultas anteriores o hacer borrón y cuenta nueva!!! Necesito ayuda llevo muchos días perdidos :(
GRACIAS!
[ id ] [ usuario_origen ] [ usuario_destino ] [ fecha ] [ mensaje ] [ visto_destino ]
Objetivo: QUIERO SACAR LOS ÚLTIMOS 10 ID CON LOS QUE HA CONTACTADO UN USUARIO.
Hay tres escenarios posibles:
- Usuario activo es receptor
- Usuario activo es emisor
- Usuario activo es receptor y emisor (en diferentes registros).
El problema es que el user activo puede estar en ambos lados ,usuario_origen y usuario_destino , pero desde que aparezca en uno de esos lados ya el otro usuario no debe volver a tenerse en cuenta!!!!
Condiciones: Sea fácil usar el LIMIT para ir haciendo búsquedas por bloques, los 10 últimos, los 20 últimos, ....
Actualmente tengo una solución que sabía que era 'mala' pero efectiva y resulta que no, es la siguiente:
1ª) Hago un conteo total de los ids únicos:
consulta_idsUnicos =" SELECT id FROM ".$tablabd_usuarios." WHERE id in
(SELECT usuario_origen
FROM ".$tablabd_mensajes."
WHERE usuario_destino = ".$id_usuario_activo." GROUP BY usuario_origen)
UNION
(SELECT usuario_destino
FROM ".$tablabd_mensajes."
WHERE usuario_origen = ".$id_usuario_activo." GROUP BY usuario_destino);";
2º) Uso ese total para añadir un LIMIT a la misma consulta y así conseguir los últimos:
1º] $comienzoLimit = $total_ids_unicos - $total_fichas_mostrar;
2º] $consulta_fichas = " SELECT id FROM ".$tablabd_usuarios." WHERE id in
(SELECT usuario_origen
FROM ".$tablabd_mensajes."
WHERE usuario_destino = ".$id_usuario_activo." GROUP BY usuario_origen)
UNION
(SELECT usuario_destino
FROM ".$tablabd_mensajes."
WHERE usuario_origen = ".$id_usuario_activo." GROUP BY usuario_destino)
LIMIT $comienzoLimit, $total_fichas_mostrar;";
PENSABA QUE LO TENÍA RESUELTO, mal resuelto pero resuelto, pero no. Lo que pasa es que tengo los ids ordenados por el PRIMER mensaje enviado y no por los últimos mensajes recibidos.
Así que me salen los últimos contactos NUEVOS que ha tenido el usuario y no los últimos contactos sean los que sean.
Si hay un usuario que le mandó un mensaje hace un mes y vuelve a enviar uno ahora mismo, este usuario no está posicionado en el último puesto sino que aparece ordenado cuando envió el primer mensaje hace un mes.
No sé si se pueden aprovechar las consultas anteriores o hacer borrón y cuenta nueva!!! Necesito ayuda llevo muchos días perdidos :(
GRACIAS!
Valora esta pregunta


0