sql >> Base de Datos >  >> RDS >> Mysql

MySQL agrupa con 2 columnas cuando los valores se intercambian en columnas

Una forma de determinar el "hilo" para cada fila es CONCAT() el LEAST de los dos números con el GREATEST de los mismos dos números.

Entonces podemos GROUP BY en el "hilo", para obtener el último generated_time . En HAVING cláusula, filtramos solo aquellos "hilos", que tienen al menos un 'INCOMING' mensaje con 'REVIEW' tipo.

Ver en 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;

Resultado

| 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 al margen:

  1. El enfoque anterior (y su diseño de esquema actual) no puede usar índices y, por lo tanto, no será rendimiento .
  2. Preferiría rediseñar el esquema creando dos tablas maestras adicionales. Una tabla maestra almacenaría los números de teléfono:phone_id y number
  3. Otra tabla Maestra almacenaría el "Subproceso", que contendrá el phone_id valores y thread_id . A continuación, puede utilizar este thread_id en tu message tabla, en lugar de almacenar los números de teléfono.