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

MYSQL最後の5つの異なるレコードに対して5つのレコードを選択します

    他の多くのDBMS(Oracle、SQL-Server、Postgres)では、ウィンドウ関数を使用できます。

    SELECT id, file, folder, added
    FROM
      ( SELECT id, file, folder, added,
               DENSE_RANK() OVER (ORDER BY added DESC) AS d_rank,
               ROW_NUMBER() OVER (PARTITION BY added ORDER BY id DESC) AS row_no
        FROM AviationImages
      ) d
    WHERE d_rank <= 5          -- limit number of dates
      AND row_no <= 5 ;        -- limit number of images per date
    

    MySQLには、ウィンドウ関数とOVERの贅沢はありません。 条項:

    SELECT i.id, i.file, i.folder, i.added
    FROM
        ( SELECT DISTINCT added
          FROM AviationImages
          ORDER BY added DESC
          LIMIT 5
        ) AS da
      JOIN
        AviationImages AS i
          ON  i.added = da.added
          AND i.id >= COALESCE(
              ( SELECT ti.id
                FROM AviationImages AS ti
                WHERE ti.added = da.added
                ORDER BY ti.id DESC
                LIMIT 1 OFFSET 4
              ), -2147483647) ;             -- use 0 if the `id` is unsigned int
    

    (added, id)のインデックス 効率を高めるのに役立ちます-テーブルがInnoDBとidを使用する場合 は主キーであり、(added)のインデックスです。 十分でしょう。



    1. DoctrineでLIMITを使用したサブクエリ

    2. TEXT列を返すパラメーター化されたクエリは、INT列に対して常にゼロを返します

    3. 配列をデータベースに保存するか、別の列を作成します

    4. Oracleでパラメータとしてテーブル名を渡すことは可能ですか?