sql >> Database >  >> RDS >> Mysql

MYSQL Selecteer 5 records voor de laatste 5 verschillende records

In veel andere DBMS (Oracle, SQL-Server, Postgres) zou je vensterfuncties kunnen gebruiken:

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

In MySQL heb je niet de luxe van een vensterfunctie en OVER clausule:

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

Een index op (added, id) zal de efficiëntie helpen - en als de tabel InnoDB en de id . gebruikt is de primaire sleutel, dan alleen een index op (added) zal genoeg zijn.



  1. ERROR 1130 (HY000):Host '' mag geen verbinding maken met deze MySQL-server

  2. MySQL Vind het totale aantal berichten per gebruiker

  3. Wilt u de waarde van een MySQL-veld beperken tot een specifiek bereik (decimale waarden)

  4. Kan ik een mysql Select, Update en Delete in één query doen?