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

MYSQL Vælg 5 poster for de sidste 5 distinkte poster

I mange andre DBMS (Oracle, SQL-Server, Postgres) kan du bruge vinduesfunktioner:

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

I MySQL har du ikke luksusen med vinduesfunktion og OVER klausul:

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

Et indeks på (added, id) vil hjælpe effektiviteten - og hvis tabellen bruger InnoDB og id er den primære nøgle, så kun et indeks på (added) vil være nok.



  1. Et bord vs flere borde

  2. Hvordan kan jeg indstille det maksimale antal MySQL-processer eller tråde?

  3. hvordan man beregner saldi i et regnskabssoftware ved hjælp af postgres vinduesfunktion

  4. Hvad betyder nøgleordet KEY?