Un modo per determinare il "thread" per ogni riga è CONCAT()
il LEAST
dei due numeri con il GREATEST
degli stessi due numeri.
Possiamo quindi GROUP BY
sul "thread", per ottenere l'ultimo generated_time
. In HAVING
clausola, filtriamo solo quei "thread", che hanno almeno un 'INCOMING'
messaggio con 'REVIEW'
digitare.
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;
Risultato
| 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 margine:
- L'approccio di cui sopra (e l'attuale progettazione dello schema) non è in grado di utilizzare gli indici e quindi non sarà performante .
- Preferirei riprogettare lo schema creando due tabelle Master aggiuntive. Una tabella principale memorizzerebbe i numeri di telefono:
phone_id
enumber
- Un'altra tabella principale memorizzerebbe il "Thread", che conterrà il
phone_id
valori ethread_id
. Puoi quindi utilizzare questothread_id
nel tuomessage
tabella, invece di memorizzare i numeri di telefono.