sql >> Databáze >  >> RDS >> Mysql

MySQL seskupí se 2 sloupci, když se hodnoty ve sloupcích zaměňují

Jedním ze způsobů, jak určit "vlákno" pro každý řádek, je CONCAT() LEAST ze dvou čísel s GREATEST ze stejných dvou čísel.

Potom můžeme GROUP BY na "vlákně", abyste získali nejnovější generated_time . V HAVING klauzule, odfiltrujeme pouze to "vlákno", které má alespoň jeden 'INCOMING' zprávu s 'REVIEW' typ.

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

Výsledek

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

Sidenote:

  1. Výše uvedený přístup (a váš současný návrh schématu) není schopen používat indexy, a proto nebude výkonný .
  2. Raději bych přepracoval schéma vytvořením dvou dalších hlavních tabulek. Jedna hlavní tabulka by ukládala telefonní čísla:phone_id a number
  3. V jiné hlavní tabulce by bylo uloženo vlákno, které bude obsahovat phone_id hodnoty a thread_id . Poté můžete použít toto thread_id ve vaší message místo ukládání telefonních čísel.



  1. Plánování diskového prostoru pro databáze

  2. Laravel - Querybuilder se spojením a spojením

  3. Jak získat náhodný řádek pro aktuální den?

  4. Jak připojit databázi SQL Server z příkazového řádku