Jednym ze sposobów określenia "wątku" dla każdego wiersza jest CONCAT()
NAJMNIEJ
z dwóch liczb z NAJLEPSZA
tych samych dwóch liczb.
Następnie możemy GRUPAĆ WG
w "wątku", aby uzyskać najnowszy generated_time
. W POSIADAJĄC
klauzuli, odfiltrowujemy tylko te "wątki", które mają przynajmniej jeden 'INCOMING'
wiadomość z 'PRZEGLĄD'
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;
Wynik
| 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 |
Uwaga boczna:
- Powyższe podejście (i obecny projekt schematu) nie może korzystać z indeksów, a zatem nie będzie wydajne .
- Wolałbym przeprojektować schemat, tworząc dwie dodatkowe tabele główne. Jedna tabela główna przechowuje numery telefonów:
phone_id
inumer
- Inna tabela główna będzie przechowywać „Wątek”, który będzie zawierał
phone_id
wartości ithread_id
. Następnie możesz użyć tegothread_id
w Twojejwiadomości
tabeli, zamiast przechowywać numery telefonów.