Един от начините за определяне на „нишката“ за всеки ред е CONCAT()
НАЙ-МАЛКО
от двете числа с GREATESTкод>
от същите две числа.
След това можем да ГРУПИРАМЕ ПО
в "нишката", за да получите най-новото generated_time
. В HAVING
клауза, филтрираме само онези „нишки“, които имат поне една 'INCOMING'
съобщение с „ПРЕГЛЕД“
тип.
SELECT m1.*FROM съобщение AS m1 JOIN (SELECT Concat(Най-малко(m.from_number, m.to_number), '|', Greatest(m.from_number, m.to_number)) AS нишка, Max( m.generated_time) AS max_generated_time FROM съобщение 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)) И dt.max_generated_time =m1.generated_time;
Резултат
<предварителен код>| ID | до_номер | от_номер | съобщение | посока | тип | генерирано_време || --- | ------------ | ------------ | --------------- | --------- | ------ | ------------------- || 3 | +15005550004 | +16232950692 | Как сте ? | ИЗХОДЯЩ | | 2019-07-13 21:15:00 || 5 | +16232950692 | +15005550001 | Приятен ден | ВХОДЯЩИ | ПРЕГЛЕД | 2019-07-12 12:17:00 |Странична бележка:
- Горният подход (и текущият ви дизайн на схема) не може да използва индекси и следователно няма да бъде ефективен .
- Предпочитам да преработя схемата, като създам две допълнителни главни таблици. Една главна таблица ще съхранява телефонните номера:
phone_id
иномер
- Друга главна таблица ще съхранява „Нишката“, която ще съдържа
phone_id
стойности иthread_id
. След това можете да използвате тозиthread_id
във вашетосъобщение
таблица, вместо да съхранява телефонните номера.