Een manier om de "thread" voor elke rij te bepalen is CONCAT()
de LEAST
van de twee getallen met de GREATEST
van dezelfde twee nummers.
We kunnen dan GROUP BY
op de "thread", om de laatste generated_time
. te krijgen . In HAVING
clausule, filteren we alleen die "thread", die ten minste één 'INCOMING'
heeft bericht met 'REVIEW'
typ.
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;
Resultaat
| 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 |
Kanttekening:
- Bovenstaande benadering (en uw huidige schema-ontwerp) kan geen indexen gebruiken en zal daarom niet performant zijn .
- Ik zou het schema liever opnieuw ontwerpen door twee extra hoofdtabellen te maken. Eén hoofdtabel zou de telefoonnummers opslaan:
phone_id
, ennumber
- Een andere hoofdtabel zou de "Thread" opslaan, die de
phone_id
zal bevatten waarden enthread_id
. Je kunt dan dezethread_id
. gebruiken in jemessage
tabel, in plaats van de telefoonnummers op te slaan.