Pregunta

Actualmente tengo las siguientes tablas para un foro de mensajes privados:

texto alternativo http://img159.imageshack.us/img159/45/pmdata .jpg

texto alternativo http://img504.yfrog.com/img504/3968/pminfo .jpg

Lo que intento hacer es generar una " bandeja de entrada " que muestra el hilo más reciente en la parte superior y el grupo por hilo (es decir, no ve el mismo hilo dos veces en su bandeja de entrada), sin importar quién sea el remitente.

Lo que tengo ahora funciona bien para mensajes simples entre 2 uesrs. Sin embargo, una vez que un tercer usuario responde al mismo hilo, no se muestra correctamente. Mi consulta actual es esta:

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
INNER JOIN (SELECT thread_id, sender_id, MAX(date_sent) AS thread_max_date_sent FROM pm_data GROUP BY thread_id, sender_id) deriv1 ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent AND pm_data.sender_id = deriv1.sender_id
WHERE pm_info.receiver_id = '$usrID'
ORDER BY deriv1.thread_max_date_sent DESC

Suponiendo que $ usrID = 68 (por lo tanto, receptor_id = 68), genera esto:

From: Kyle (pm_data.id = 18) RE: single message (thread_id= 13587)
From: Ed (pm_data.id = 12)   RE: single message (thread_id= 13587)
From: Ed (pm_data.id = 8)    RE: Test Number 2 (thread_id= 16256)

Observe cómo el thread_id (13587) aparece dos veces porque hay 2 remitentes diferentes.

¿Cómo podría hacer que solo muestre el thread_id más reciente, sin importar quién sea el remitente?

¡Muchas gracias!

¿Fue útil?

Solución

En realidad parece que la consulta en la pregunta original solo requiere un cambio muy pequeño para obtener el registro más reciente de cada hilo.

  1. suelte el sender_id en los campos GROUP BY de la subconsulta
  2. suelte el pm_data.sender_id = deriv1.sender_id en la cláusula ON
SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
INNER JOIN (SELECT thread_id, /*sender_id,*/ MAX(date_sent) AS thread_max_date_sent 
                FROM pm_data GROUP BY thread_id /*, sender_id*/) deriv1 
    ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent /*AND pm_data.sender_id = deriv1.sender_id*/
WHERE pm_info.receiver_id = '$usrID'
ORDER BY deriv1.thread_max_date_sent DESC

Como nota al margen: si es posible, busque el ID de mensaje máximo en esa subconsulta en lugar de max (date_sent)

Otros consejos

Probar

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid
FROM pm_data, pm_info, tblUsers as sender 
WHERE pm_info.message_id = pm_data.id 
  AND pm_data.sender_id = sender.usrID
  AND pm_info.receiver_id = '$usrID'
GROUP BY thread_id
ORDER BY date_sent DESC
LIMIT 0,1

Probar

SELECT pm_info.is_read, group_concat(DISTINCT sender.usrFirst) as sender_name,
    pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid,
    MAX(date_sent) AS thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
WHERE pm_info.receiver_id = '$usrID'
GROUP BY pm_data.thread_id
ORDER BY thread_max_date_sent DESC;

Siéntase libre de estar en desacuerdo con la parte group_concat, si no satisface sus necesidades; simplemente enumera todos los remitentes relevantes en lugar de elegir uno arbitrariamente.

Mi sugerencia sería dividir su base de datos en dos tablas para una mejor normalización: '' hilo '' y "mensaje". Hay información de hilo que sería común a todos los mensajes, como el título del hilo. Está desperdiciando espacio en la tabla de mensajes repitiendo los mismos valores.

Puede tener una " última hora de publicación " coloque la tabla de hilos, que se actualiza en cada nueva publicación. Entonces es solo una simple cuestión de seleccionar de la tabla de hilos y ordenar por la última publicación. También será mucho más rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top