sql >> Databasteknik >  >> RDS >> Mysql

MySQL-grupp med 2 kolumner när värden byts ut i kolumner

Ett sätt att bestämma "tråden" för varje rad är CONCAT() MINST av de två siffrorna med STÖRSTA av samma två nummer.

Vi kan sedan GRUPPERA EFTER på "tråden", för att få den senaste generated_time . I HAVING sats, filtrerar vi bara bort de "trådar", som har minst en 'INKOMMANDE' meddelande med 'REVIEW' typ.

Visa på 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;

Resultat

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

Sidenot:

  1. Ovanstående tillvägagångssätt (och din nuvarande schemadesign) kan inte använda index och kommer därför inte att vara presterande .
  2. Jag skulle hellre designa om schemat genom att skapa ytterligare två huvudtabeller. En huvudtabell skulle lagra telefonnumren:phone_id och nummer
  3. En annan huvudtabell skulle lagra "Tråden", som kommer att innehålla phone_id värden och thread_id . Du kan sedan använda detta thread_id i ditt meddelande tabell, istället för att lagra telefonnumren.



  1. Felsökning av Microsoft SQL Server Error 18456

  2. Hur hittar jag alla lagrade procedurer som infogar, uppdaterar eller tar bort poster?

  3. Implementera MySQL händelseavisering tillbaka till en Delphi-applikation

  4. MySQL LIKE begränsande