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

Valg af sammenhængende blok af poster i mysql

Der er et simpelt trick til at kollapse på hinanden følgende poster i en enkelt gruppe. Hvis du grupperer efter (row_number - entry), vil de poster, der er fortløbende, ende i samme gruppe. Her er et eksempel, der viser, hvad jeg mener:

Forespørgsel :

SELECT phonenum, @curRow := @curRow + 1 AS row_number, phonenum - @curRow
from phonenums p
join (SELECT @curRow := 0) r
 

Resultater :

| PHONENUM | ROW_NUMBER | PHONENUM - @CURROW | ------------------------------------------------- | 27100070000 | 1 | 27100069999 | | 27100070001 | 2 | 27100069999 | | 27100070002 | 3 | 27100069999 | | 27100070003 | 4 | 27100069999 | | 27100070004 | 5 | 27100069999 | | 27100070005 | 6 | 27100069999 | | 27100070008 | 7 | 27100070001 | | 27100070009 | 8 | 27100070001 | | 27100070012 | 9 | 27100070003 | | 27100070015 | 10 | 27100070005 | | 27100070016 | 11 | 27100070005 | | 27100070040 | 12 | 27100070028 |

Bemærk, hvordan de poster, der er fortløbende, alle har den samme værdi for PHONENUM - @CURROW . Hvis vi grupperer på den kolonne og vælger min og maks for hver gruppe, har du oversigten (med én undtagelse:du kan erstatte END-værdien med NULL hvis START =SLUT, hvis det er et krav):

Forespørgsel :

select min(phonenum), max(phonenum) from
(
  SELECT phonenum, @curRow := @curRow + 1 AS row_number
  from phonenums p
  join (SELECT @curRow := 0) r
) p
group by phonenum - row_number
 

Resultater :

| MIN(PHONENUM) | MAX(PHONENUM) | --------------------------------- | 27100070000 | 27100070005 | | 27100070008 | 27100070009 | | 27100070012 | 27100070012 | | 27100070015 | 27100070016 | | 27100070040 | 27100070040 |

Demo:http://www.sqlfiddle.com/#!2/59b04/5




  1. Kopier data til ny tabel i MySQL

  2. Få områder med forbedringer i PostgreSQL 9.4

  3. MySQL med Soft-Deletion, Unique Key og Foreign Key Constraints

  4. Sådan vælger du den sidste post fra MySQL-tabel ved hjælp af SQL-syntaks