Mysql
 sql >> Base de données >  >> RDS >> Mysql

Grouper MySQL par avec 2 colonnes lorsque les valeurs sont échangées dans des colonnes

Une façon de déterminer le "thread" pour chaque ligne est CONCAT() le LEAST des deux nombres avec le GREATEST des deux mêmes nombres.

On peut alors GROUP BY sur le "thread", pour obtenir le dernier generated_time . Dans HAVING clause, nous filtrons uniquement les "threads", qui ont au moins un 'INCOMING' message avec 'REVIEW' saisir.

Voir sur 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;

Résultat

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

Note complémentaire :

  1. L'approche ci-dessus (et votre conception de schéma actuelle) n'est pas capable d'utiliser des index, et donc elle ne sera pas performante .
  2. Je préférerais reconcevoir le schéma en créant deux tables Master supplémentaires. Une table principale stockerait les numéros de téléphone :phone_id , et number
  3. Une autre table maître stockerait le "Thread", qui contiendrait le phone_id valeurs et thread_id . Vous pouvez ensuite utiliser ce thread_id dans votre message table, au lieu de stocker les numéros de téléphone.