sql >> Database >  >> RDS >> Mysql

MySQL groeperen op met 2 kolommen wanneer waarden in kolommen worden verwisseld

Een manier om de "thread" voor elke rij te bepalen is CONCAT() de LEAST van de twee getallen met de GREATEST van dezelfde twee nummers.

We kunnen dan GROUP BY op de "thread", om de laatste generated_time . te krijgen . In HAVING clausule, filteren we alleen die "thread", die ten minste één 'INCOMING' heeft bericht met 'REVIEW' typ.

Bekijken op 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;

Resultaat

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

Kanttekening:

  1. Bovenstaande benadering (en uw huidige schema-ontwerp) kan geen indexen gebruiken en zal daarom niet performant zijn .
  2. Ik zou het schema liever opnieuw ontwerpen door twee extra hoofdtabellen te maken. Eén hoofdtabel zou de telefoonnummers opslaan:phone_id , en number
  3. Een andere hoofdtabel zou de "Thread" opslaan, die de phone_id zal bevatten waarden en thread_id . Je kunt dan deze thread_id . gebruiken in je message tabel, in plaats van de telefoonnummers op te slaan.



  1. MySQL - alle records bijwerken zodat ze overeenkomen met de maximale waarde in de groep

  2. Database voor zoeken in volledige tekst en 200 miljoen records

  3. Verbindingstime-out voor DriverManager getConnection

  4. Limiet voor het uploaden van documenten