Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL group by com 2 colunas quando os valores são trocados em colunas


Uma maneira de determinar o "thread" para cada linha é CONCAT() o MENOS dos dois números com o GREATEST dos mesmos dois números.

Podemos então GROUP BY no "thread", para obter o generated_time mais recente . Em TER cláusula, filtramos apenas aqueles "thread", que tem pelo menos um 'INCOMING' mensagem com 'REVIEW' modelo.

Visualizar no 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:
  1. A abordagem acima (e seu design de esquema atual) não pode usar índices e, portanto, não terá desempenho .
  2. Prefiro redesenhar o esquema criando duas tabelas mestre adicionais. Uma tabela mestre estaria armazenando os números de telefone:phone_id e número
  3. Outra tabela mestre estaria armazenando o "Thread", que conterá o phone_id valores e thread_id . Você pode então usar este thread_id na sua mensagem tabela, em vez de armazenar os números de telefone.