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_id
ynumber
- Otra tabla Maestra almacenaría el "Subproceso", que contendrá el
phone_id
valores ythread_id
. A continuación, puede utilizar estethread_id
en tumessage
tabla, en lugar de almacenar los números de teléfono.