Uma maneira de determinar o "thread" para cada linha é
CONCAT()
o MENOS
dos dois números com o GREATEST
dos mesmos dois números. Podemos então
GROUP BY
no "thread", para obter o generated_time
mais recente . Em TER
cláusula, filtramos apenas aqueles "thread", que tem pelo menos um 'INCOMING'
mensagem com 'REVIEW'
modelo. Visualizar no DB Fiddle
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:
- A abordagem acima (e seu design de esquema atual) não pode usar índices e, portanto, não terá desempenho .
- Prefiro redesenhar o esquema criando duas tabelas mestre adicionais. Uma tabela mestre estaria armazenando os números de telefone:
phone_id
enúmero
- Outra tabela mestre estaria armazenando o "Thread", que conterá o
phone_id
valores ethread_id
. Você pode então usar estethread_id
na suamensagem
tabela, em vez de armazenar os números de telefone.