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

[SOLUCIONADO] Registros uncios Mysql

Estas en el tema de Registros uncios Mysql en el foro de Mysql en Foros del Web. Hola amigos! Necesito una mano muy grande, vi que es un tema que se habló varias veces en el foro, pero no puedo dar con ...
  #1 (permalink)  
Antiguo 18/09/2012, 20:53
 
Fecha de Ingreso: mayo-2010
Mensajes: 35
Antigüedad: 14 años
Puntos: 1
Registros uncios Mysql

Hola amigos!

Necesito una mano muy grande, vi que es un tema que se habló varias veces en el foro, pero no puedo dar con la solución ='(

El tema es el siguiente:

Tengo una base de datos con mensajes. Esta es su estructura

mensaje_id | id_reimtente | id_destinatario | leido_mensaje | fecha | cuerpo

Básicamente cuando el usuarios 1 envía un mensaje y el usuario 2 responde a ese mensaje la tabla queda de la siguiente forma



Esto quiere decir que entre usuario 1 y usuario 2 hay una conversación....

Para listarla es fácil, simplemente hago un select * donde las ids sean 1 y 2 (o viceversa) y las ordeno por fecha.

El problema está cuando quiero mostrar las conversaciones que esta llevando, yo tendria que pedirle todos los registros en los que el usuario está como remitente (o como destinatario) pero a su vez decirle que no me repita los resultados. Osea que, si usuario 1 (remitente) ya fue encontrado en una conversación con usuario 2 (destinatario) y luego encuentra la inversa (Usuario 1 destinarario Y usuario 2 remitente) no me lo muestre.

¿Alguna idea? Me estoy rompiendo el coco pero no entiendo!

Gracias desde ya!
Saludos
  #2 (permalink)  
Antiguo 19/09/2012, 11:49
 
Fecha de Ingreso: mayo-2010
Mensajes: 35
Antigüedad: 14 años
Puntos: 1
Respuesta: Registros uncios Mysql

Ya intenté con DISTINT pero no dio resultado =(

Estoy desesperado
  #3 (permalink)  
Antiguo 19/09/2012, 13:56
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Registros uncios Mysql

Hola señor, pues mira a primera vista tenemos esto:

mensaje_id | id_reimtente | id_destinatario | leido_mensaje | fecha | cuerpo

lo que nos indica que bastaría con lo siguiente:

SELECT * FROM TablaMensajes WHERE id_reimtente ="myId" ORDER BY fecha GROUP BY id_destinatario.

algunos manejadores no permiten usar order by y group by, pero me imagino que sólo con el group by bastaría ¿es correcto esto?
  #4 (permalink)  
Antiguo 19/09/2012, 14:07
 
Fecha de Ingreso: mayo-2010
Mensajes: 35
Antigüedad: 14 años
Puntos: 1
Respuesta: Registros uncios Mysql

Que raro @lalounam!!!!

Siempre ayudando como el mejor! jaja Por mucho uno de los mejores usuarios :D

Gracias!
  #5 (permalink)  
Antiguo 19/09/2012, 14:58
 
Fecha de Ingreso: mayo-2010
Mensajes: 35
Antigüedad: 14 años
Puntos: 1
Respuesta: Registros uncios Mysql

Bueno, ahora tenemos otro problema. Me gustaría aclarar algo:

El script tiene dos partes
La segunda es la conversación propiamente dicha: Es un simple select:

SELECT * FROM `mensajes` WHERE `(id_reimtente`=YO AND `id_destinatario`=AMIGO) OR (id_reimtente`=AMIGO AND `id_destinatario`=YO) ORDER BY `fecha`

Eso es simple, luego con un mysql_fetch_array está listado y lindo.

El problema está con la primer parte, cuando tengo que listar a todas las conversaciones, mostrar algo como:

Elige la conversación que quieres ver
-Juan -> <a href=ver/id de juan>
-Pedro -> <a href=ver/id de Pedro>
-Maria -> <a href=ver/id de Maria>
-Tito -> <a href=ver/id de Tito>

Ahora, ya no es tan fácil...

No puedo hacer un SELECT * FORM mensajes, porque si hay 5 mensajes cruzados con alguno su nombre va a aparecer 5 veces...

La opción de lalounam fue fantástica, y está muy cerca, pero no logra su objetivo, ya que en el hipotético caso de que yo sea el destinatario, pero no haya respondido, esa conversación no se mostrará, ya que yo solo estoy "eligiendo" los registros en los que yo soy el remitente.

¿Alguna nueva idea?

Gracias nuevamente
  #6 (permalink)  
Antiguo 19/09/2012, 15:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Registros uncios Mysql

HyQnet,
borré mi anterior respuesta, porque creí que lo tenías solucionado y pensé no haberte entendido. Todavía no las tengo todas conmigo. Verás, no entiendo bien qué consideras tú conversación. No existe un identificador de conversación y resultará imposible definirla. Una conversación podría durar horas entre dos días; y si cambia el tema y crean otra conversación esas dos mismas personas, ¿sería la misma? En fin, que si lo que quieres es sacar intervenciones únicas de dos interlocutores, parejas únicas, sin que se repitan los interlocutores, yo ideé esto que te escribo debajo, pero no olvidéis que soy un hombre de letras, de modo que nadie se ría de mí en estos foros técnicos, no es más que una ocurrencia. Creé un campo de control según el cual sumo los id de remitente y destinatario, y a eso le sumo el producto de ambos. En los casos de reverso, es decir, cuando remitente y destinatario se intercambian, el valor será el mismo. Primero agrupo por ese número de control tras traerme aquellos registros en que los interlocutores son los mismos, y dejo uno solo; luego mediante UNION le uno los demás, es decir, aquellos cuya suma agrupada de ese control es 1 y solo 1. Y así me salen todos, sin repetición, aunque claro, en dos columnas distintas...

(
SELECT T1.id, T1.id_remitente, T1.id_destinatario, (
T1.id_remitente + T1.id_destinatario + ( T1.id_remitente * T1.id_destinatario )
)control
FROM `tabla1` T2
INNER JOIN tabla1 T1 ON ( T1.id_remitente = T2.id_destinatario
AND T1.id_destinatario = T2.id_remitente )
GROUP BY control
)
UNION ALL (

SELECT T1.id, T1.id_remitente, T1.id_destinatario, (
T1.id_remitente + T1.id_destinatario + ( T1.id_remitente * T1.id_destinatario )
)control
FROM `tabla1` T1
GROUP BY control
HAVING COUNT( * ) =1
)

Última edición por jurena; 19/09/2012 a las 15:59
  #7 (permalink)  
Antiguo 20/09/2012, 09:17
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Registros uncios Mysql

Hola, se me ocurre lo siguiente:

Primero listas todas las conversaciones de un individuo, de ahí una vez que elijan que quieren dar seguimiento a una conversación en particular tendrás a las dos individuos que están involucrados, así que basta con seleccionar de esta manera:

SELECT * FROM Mensajes where (remitente='Lalo' and destinatario='Juan') OR (remitente = 'Juan' AND destinatario='Lalo') order by fecha asc

Y según yo así tendrías toda la conversación en orden cronológico y sin repetición, ¿esto es correcto?

Saludos.
  #8 (permalink)  
Antiguo 20/09/2012, 10:37
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Registros uncios Mysql

Si, me faltaba el caso mas difícil, pero lo HE CONSEGUIDO, explico:

Obtener la lista de aquellos con los que has tenido algún mensaje implica una repetición en el caso en que te escribieron y contestaste, así:

Remitente Destinatario
---------------------------------
Lalo Juan
Juan Lalo

ya que si preguntamos dame todos los mensajes de los que sea remitente pero sin repetir destinatarios:

(SELECT destinatario FROM Mensajes where remitente='Lalo' group by destinatario)

y al revez, de los que se a destinatario pero sin repetir remitente:

(SELECT remitente FROM Mensajes where destinatario='Lalo' group by remitente)

lo que nos da dos consultas correctas, pero seguimos con la repetición si se da el caso de que un elemento esté en ambas listas, juntando ambas consultas podemos obtener esto:

select destinatario,remitente from Mensajes where remitente='Lalo' or destinatario='Lalo' group by destinatario,remitente

resultando:

destinatario remitente
-----------------------------------
Juan Lalo
Lalo Juan
Lalo Miguel

Aquí se ve la repetición de la que se habla, pues para evitarla solo hay que notar que Juan es destinatario y remitente, pues evitemos que sea una de las dos y listo:

select destinatario,remitente from Mensajes where (remitente='Lalo' or destinatario='Lalo') and (remitente not in (SELECT destinatario FROM Mensajes where remitente='Lalo')) group by destinatario,remitente

dando como resultado:

destinatario remitente
-----------------------------------
Juan Lalo
Lalo Miguel

LISTO!!!

Una cosa importante, NO ES LA SOLUCIÓN MÁS EFICIENTE lo sé, pero es un caso raro en el que se trata de evitar la repetición en columnas diferentes.

Espero te sirva, saludos.
  #9 (permalink)  
Antiguo 20/09/2012, 11:47
 
Fecha de Ingreso: mayo-2010
Mensajes: 35
Antigüedad: 14 años
Puntos: 1
Respuesta: Registros uncios Mysql

Wow! Me encanta!!

Hay una sola cosa que no entiendo... ¿porque no es la solución mas eficiente?
  #10 (permalink)  
Antiguo 20/09/2012, 11:55
Avatar de Lalounam  
Fecha de Ingreso: mayo-2012
Ubicación: México D.F.
Mensajes: 59
Antigüedad: 12 años
Puntos: 19
Respuesta: Registros uncios Mysql

Pues no tuve tiempo de analizar si hay otro más eficiente, me imagino que si, pero el hecho de incluir un select anidado le quita elegancia jajaja

Etiquetas: registros, select, tabla
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 01:35.