Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL raggruppa in base a 2 colonne quando i valori vengono scambiati in colonne

Un modo per determinare il "thread" per ogni riga è CONCAT() il LEAST dei due numeri con il GREATEST degli stessi due numeri.

Possiamo quindi GROUP BY sul "thread", per ottenere l'ultimo generated_time . In HAVING clausola, filtriamo solo quei "thread", che hanno almeno un 'INCOMING' messaggio con 'REVIEW' digitare.

Visualizza su DB Fiddle

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;

Risultato

| 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 |

Nota a margine:

  1. L'approccio di cui sopra (e l'attuale progettazione dello schema) non è in grado di utilizzare gli indici e quindi non sarà performante .
  2. Preferirei riprogettare lo schema creando due tabelle Master aggiuntive. Una tabella principale memorizzerebbe i numeri di telefono:phone_id e number
  3. Un'altra tabella principale memorizzerebbe il "Thread", che conterrà il phone_id valori e thread_id . Puoi quindi utilizzare questo thread_id nel tuo message tabella, invece di memorizzare i numeri di telefono.