Una forma de determinar el "hilo" para cada fila es CONCAT()
el LEAST
de los dos números con el GREATEST
de los mismos dos números.
Entonces podemos GROUP BY en el "hilo", para obtener el último generated_time . En HAVING cláusula, filtramos solo aquellos "hilos", que tienen al menos un 'INCOMING' mensaje con 'REVIEW' tipo.
SELECT m1.*
FROM message AS m1
JOIN (SELECT Concat(Least(m.from_number, m.to_number), '|',
Greatest(m.from_number,
m.to_number))
AS
thread,
Max(m.generated_time)
AS max_generated_time
FROM message AS m
GROUP BY thread
HAVING Sum(m.direction = 'INCOMING'
AND m.type = 'REVIEW')) AS dt
ON dt.thread = Concat(Least(m1.from_number, m1.to_number), '|',
Greatest(m1.from_number, m1.to_number))
AND dt.max_generated_time = m1.generated_time;
Resultado
| id | to_number | from_number | message | direction | type | generated_time |
| --- | ------------ | ------------ | --------------- | --------- | ------ | ------------------- |
| 3 | +15005550004 | +16232950692 | How are you ? | OUTGOING | | 2019-07-13 21:15:00 |
| 5 | +16232950692 | +15005550001 | Have a nice day | INCOMING | REVIEW | 2019-07-12 12:17:00 |
Nota al margen:
- El enfoque anterior (y su diseño de esquema actual) no puede usar índices y, por lo tanto, no será rendimiento .
- Preferiría rediseñar el esquema creando dos tablas maestras adicionales. Una tabla maestra almacenaría los números de teléfono:
phone_idynumber - Otra tabla Maestra almacenaría el "Subproceso", que contendrá el
phone_idvalores ythread_id. A continuación, puede utilizar estethread_iden tumessagetabla, en lugar de almacenar los números de teléfono.