Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL grupuj według 2 kolumn, gdy wartości są wymieniane w kolumnach

Jednym ze sposobów określenia "wątku" dla każdego wiersza jest CONCAT() NAJMNIEJ z dwóch liczb z NAJLEPSZA tych samych dwóch liczb.

Następnie możemy GRUPAĆ WG w "wątku", aby uzyskać najnowszy generated_time . W POSIADAJĄC klauzuli, odfiltrowujemy tylko te "wątki", które mają przynajmniej jeden 'INCOMING' wiadomość z 'PRZEGLĄD' typ.

Wyświetl na 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;

Wynik

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

Uwaga boczna:

  1. Powyższe podejście (i obecny projekt schematu) nie może korzystać z indeksów, a zatem nie będzie wydajne .
  2. Wolałbym przeprojektować schemat, tworząc dwie dodatkowe tabele główne. Jedna tabela główna przechowuje numery telefonów:phone_id i numer
  3. Inna tabela główna będzie przechowywać „Wątek”, który będzie zawierał phone_id wartości i thread_id . Następnie możesz użyć tego thread_id w Twojej wiadomości tabeli, zamiast przechowywać numery telefonów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. czy każde wywołanie mysql_real_escape_string wymaga kolejnej podróży do bazy danych?

  2. Jak mogę wyliczyć możliwe wartości w bazie danych MySQL?

  3. Optymalizacja logiki MySql

  4. Procedura składowana MYSQL, przypadek

  5. Jak przekonwertować mysql do kreatora zapytań laravel