sql >> データベース >  >> RDS >> Mysql

mysqlでレコードの連続ブロックを選択する

    連続するエントリを1つのグループにまとめる簡単なトリックがあります。 (row_number-entry)でグループ化すると、連続するエントリは同じグループになります。これが私が何を意味するかを示す例です:

    クエリ

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

    結果

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

    連続するすべてのエントリのPHONENUM - @CURROWの値が同じであることに注意してください。 。その列でグループ化し、各グループの最小値と最大値を選択すると、要約が表示されます(1つの例外を除いて、END値をNULLに置き換えることができます。 START =ENDの場合、それが要件の場合):

    クエリ

    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
    

    結果

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

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




    1. PHP / MySQLでは、複数のデータベース接続を開く必要がありますか、それとも1を共有する必要がありますか?

    2. MySQLWorkbenchはmysql.procをロードできません

    3. MYSQL、非常に遅い順序

    4. 拡張イベントでの述語注文の問題