Salah satu cara untuk menentukan "utas" untuk setiap baris adalah CONCAT()
LEAST
dari dua angka dengan GREATEST
dari dua bilangan yang sama.
Kami kemudian dapat GROUP BY
di "utas", untuk mendapatkan generated_time
terbaru . Di HAVING
klausa, kami memfilter hanya "utas", yang memiliki setidaknya satu 'INCOMING'
pesan dengan 'REVIEW'
ketik.
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;
Hasil
| 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 |
Catatan Tambahan:
- Pendekatan di atas (dan desain skema Anda saat ini) tidak dapat menggunakan indeks, dan karenanya tidak akan berperforma .
- Saya lebih suka mendesain ulang skema dengan membuat dua tabel Master tambahan. Satu tabel Master akan menyimpan nomor telepon:
phone_id
, dannumber
- Tabel Master lain akan menyimpan "Utas", yang akan berisi
phone_id
nilai danthread_id
. Anda kemudian dapat menggunakanthread_id
ini dimessage
. Anda tabel, alih-alih menyimpan nomor telepon.