Един от начините за определяне на „нишката“ за всеки ред е 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във вашетосъобщениетаблица, вместо да съхранява телефонните номера.