Eine Möglichkeit, den "Thread" für jede Zeile zu bestimmen, ist CONCAT()
der LEAST
der beiden Zahlen mit dem GREATEST
der gleichen zwei Zahlen.
Wir können dann GROUP BY
im "Thread", um die neueste generated_time
zu erhalten . In HAVING
-Klausel filtern wir nur den "Thread" heraus, der mindestens einen 'INCOMING'
hat Nachricht mit 'REVIEW'
Typ.
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;
Ergebnis
| 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 |
Nebenbemerkung:
- Der obige Ansatz (und Ihr aktuelles Schemadesign) kann keine Indizes verwenden und ist daher nicht performant .
- Ich würde lieber das Schema umgestalten, indem ich zwei zusätzliche Master-Tabellen erstelle. Eine Haupttabelle würde die Telefonnummern speichern:
phone_id
, undnumber
- Eine andere Master-Tabelle würde den "Thread" speichern, der die
phone_id
enthält Werte undthread_id
. Sie können dann diesethread_id
verwenden in Ihrermessage
Tabelle, anstatt die Telefonnummern zu speichern.