Ett sätt att bestämma "tråden" för varje rad är CONCAT()
MINST
av de två siffrorna med STÖRSTA
av samma två nummer.
Vi kan sedan GRUPPERA EFTER
på "tråden", för att få den senaste generated_time
. I HAVING
sats, filtrerar vi bara bort de "trådar", som har minst en 'INKOMMANDE'
meddelande med '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;
Resultat
| 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 |
Sidenot:
- Ovanstående tillvägagångssätt (och din nuvarande schemadesign) kan inte använda index och kommer därför inte att vara presterande .
- Jag skulle hellre designa om schemat genom att skapa ytterligare två huvudtabeller. En huvudtabell skulle lagra telefonnumren:
phone_id
ochnummer
- En annan huvudtabell skulle lagra "Tråden", som kommer att innehålla
phone_id
värden ochthread_id
. Du kan sedan använda dettathread_id
i dittmeddelande
tabell, istället för att lagra telefonnumren.