MySql Query: Select top 3 rows from table for each category

LIMIT only stops the number of results the statement returns. What you’re looking for is generally called analytic/windowing/ranking functions – which MySQL doesn’t support but you can emulate using variables:

SELECT x.*
  FROM (SELECT t.*,
               CASE 
                 WHEN @category != t.category THEN @rownum := 1 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := t.category AS var_category
          FROM TBL_ARTIKUJT t
          JOIN (SELECT @rownum := NULL, @category := '') r
      ORDER BY t.category) x
 WHERE x.rank <= 3

If you don’t change SELECT x.*, the result set will include the rank and var_category values – you’ll have to specify the columns you really want if this isn’t the case.

Leave a Comment