各行の「スレッド」を決定する1つの方法は、 CONCAT()
LEAST
GREATEST
同じ2つの数字の。
次に、GROUP BY
を実行できます 「スレッド」で、最新のgenerated_time
を取得します 。 HAVING
句では、少なくとも1つの'INCOMING'
を持つ「スレッド」のみを除外します。 'REVIEW'
のメッセージ タイプ。
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;
結果
| 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 |
補足:
- 上記のアプローチ(および現在のスキーマ設計)ではインデックスを使用できないため、パフォーマンスが向上しません 。
- 2つの追加のマスターテーブルを作成して、スキーマを再設計したいと思います。 1つのマスターテーブルに電話番号が格納されます:
phone_id
、およびnumber
- 別のマスターテーブルには、
phone_id
を含む「スレッド」が格納されます。 値とthread_id
。その後、このthread_id
を使用できますmessage
で 電話番号を保存する代わりに、テーブル。