Một cách để xác định "luồng" cho mỗi hàng là CONCAT()
LEAST
trong hai số có GREATEST
của hai số giống nhau.
Sau đó, chúng ta có thể GROUP BY
trên "chuỗi", để tải generated_time
mới nhất . Trong HAVING
, chúng tôi chỉ lọc ra những "chuỗi" có ít nhất một 'INCOMING'
tin nhắn với 'REVIEW'
loại.
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;
Kết quả
| 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 |
Chú thích bên lề:
- Phương pháp tiếp cận ở trên (và thiết kế giản đồ hiện tại của bạn) không thể sử dụng các chỉ mục và do đó nó sẽ không hiệu quả .
- Tôi muốn thiết kế lại giản đồ bằng cách tạo thêm hai bảng Chính. Một bảng Chính sẽ lưu trữ các số điện thoại:
phone_id
vànumber
- Một bảng Chính khác sẽ lưu trữ "Chuỗi", sẽ chứa
phone_id
giá trị vàthread_id
. Sau đó, bạn có thể sử dụngthread_id
này trongmessage
của bạn bảng, thay vì lưu trữ số điện thoại.