Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL gruppiert nach mit 2 Spalten, wenn Werte in Spalten ausgetauscht werden

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.

Auf DB Fiddle ansehen

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:

  1. Der obige Ansatz (und Ihr aktuelles Schemadesign) kann keine Indizes verwenden und ist daher nicht performant .
  2. Ich würde lieber das Schema umgestalten, indem ich zwei zusätzliche Master-Tabellen erstelle. Eine Haupttabelle würde die Telefonnummern speichern:phone_id , und number
  3. Eine andere Master-Tabelle würde den "Thread" speichern, der die phone_id enthält Werte und thread_id . Sie können dann diese thread_id verwenden in Ihrer message Tabelle, anstatt die Telefonnummern zu speichern.