sql >> Database >  >> RDS >> Mysql

Selecteer N records voor elke categorie en bestel op X

MySQL niet ondersteunt analytische functies (ROW_NUMBER, RANK, DENSE_RANK, NTILE...), maar u kunt de functionaliteit emuleren met variabelen.

Als je de N . wilt meest recente blogberichten:

SELECT x.id,
       x.title,
       x.description,
       x.cat,
       x.filename,
       x.date
  FROM (SELECT bp.id,
               bp.title,
               bp.description,
               bp.cat,
               bp.filename,
               bp.date,
               CASE 
                 WHEN bp.cat = @category THEN @rownum := @rownum + 1
                 ELSE @rownum := 1
               END AS rank,
               @category := bp.cat
          FROM BLOG_POSTS bp
          JOIN (SELECT @rownum := 0, @category := NULL) r
      ORDER BY bp.cat, bp.date DESC) x
 WHERE x.rank <= N

Als je de eerste blogpost van 1 wilt, verander dan ORDER BY in:

ORDER BY bp.cat, bp.date


  1. SQL:Selecteer het laatste record voor elke dag gegeven datetime

  2. Gegevens niet opgeslagen met behulp van voorbereide verklaringen

  3. Waarden invoegen van een tabel naar een tabel

  4. Hoe het aantal getroffen rijen te krijgen, tijdens het uitvoeren van een MySQL-query vanuit bash?