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_idochnummer - En annan huvudtabell skulle lagra "Tråden", som kommer att innehålla
phone_idvärden ochthread_id. Du kan sedan använda dettathread_idi dittmeddelandetabell, istället för att lagra telefonnumren.