sql >> Database teknologi >  >> RDS >> Mysql

MySQL-grupper med 2 kolonner, når værdier udveksles i kolonner

En måde at bestemme "tråden" for hver række på er CONCAT() MINST af de to tal med STØRSTE af de samme to tal.

Vi kan derefter GRUPPER EFTER på "tråden", for at få den seneste genereret_tid . I HAVING klausul, frafiltrerer vi kun de "tråde", som har mindst én 'INDKOMMENDE' besked med 'REVIEW' type.

Se 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.genereret_tid) AS max_generated_time FRA meddelelse AS m GRUPPE VED tråd HAVING Sum(m.direction ='INDKOMMENDE' OG m.type ='REVIEW')) AS dt ON dt.thread =Concat(Mindst(m1.fra_nummer, m1. to_number), '|', Greatest(m1.from_number, m1.to_number)) OG dt.max_generated_time =m1.generated_time;

Resultat

| id | til_nummer | fra_nummer | besked | retning | type | genereret_tid || --- | ------------ | ------------ | --------------- | ---------- | ------ | ------------------ || 3 | +15005550004 | +16232950692 | Hvordan har du det ? | UDGÅENDE | | 13-07-2019 21:15:00 || 5 | +16232950692 | +15005550001 | Hav en god dag | INDGÅENDE | ANMELDELSE | 2019-07-12 12:17:00 |

Sidenote:

  1. Ovenstående tilgang (og dit nuværende skemadesign) er ikke i stand til at bruge indekser, og det vil derfor ikke være effektivt .
  2. Jeg vil hellere omdesigne skemaet ved at oprette to ekstra mastertabeller. En mastertabel ville gemme telefonnumrene:phone_id og nummer
  3. En anden mastertabel ville gemme "Tråden", som vil indeholde phone_id værdier og thread_id . Du kan derefter bruge denne thread_id i din besked tabel, i stedet for at gemme telefonnumrene.



  1. Er et PHP, Python, PostgreSQL-design velegnet til en forretningsapplikation?

  2. Kan ikke oprette forbindelse til localhost ved hjælp af Pythons MySQLdb

  3. Oracle SQL- Flag poster baseret på postens dato vs. historie

  4. grupper efter og bestil efter i mysql-forespørgsel