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_identhält Werte undthread_id. Sie können dann diesethread_idverwenden in IhrermessageTabelle, anstatt die Telefonnummern zu speichern.