Problema de N superior por grupo Sql en mysql

Tengo un problema para consultar las N principales por categoría de un set de datos similar al que se muestra a continuación. He visto varios hilos sobre esto, pero estoy teniendo problemas para adaptar su consulta a mi problema específico.

+----+---------------------------------+-------+ | ID | Prod |Cat Id | +----+---------------------------------+-------+ | 1 | kntrn | 1 | | 2 | kntrn e | 1 | | 3 | e spl | 1 | | 4 | spl php | 1 | | 5 | php cicarnetworkinggtal | 1 | | 6 | cicarnetworkinggtal servecounterstrike | 1 | | 7 | servecounterstrike com | 1 | | 8 | zlv | 2 | | 9 | zlv enter | 2 | | 10 | spl php | 2 | +----+---------------------------------+-------+ 

Quiero agruparme según esta regla (1) Seleccionar Top 3 Prod para cada catid.

Tenga en count que arriba en este sentido es el recuento más alto de prod en todas las categorías.

Entonces, para el ejemplo anterior, spl php es el más alto para catID 1 porque ocurre dos veces en toda la categoría.

Esto puede no ser muy bonito, pero creo que funcionará:

 SELECT cat_id, prod, pos FROM ( SELECT cat_id, pos, prod, if(@last_id = cat_id, @cnt := @cnt + 1, (@cnt := 0 || @last_id := cat_id)) cnt FROM ( SELECT p.cat_id, pseq.cnt pos, pseq.prod FROM ( SELECT prod, count(*) cnt FROM prods GROUP BY prod ORDER BY cnt DESC ) pseq INNER JOIN prods p ON p.prod = pseq.prod ORDER BY cat_id, pseq.cnt DESC ) po ) plist WHERE cnt <= 3; Based on the above data, this will return: +--------+-----------+-----+ | cat_id | prod | pos | +--------+-----------+-----+ | 1 | spl php | 2 | | 1 | kntrn | 1 | | 1 | kntrn e | 1 | | 2 | spl php | 2 | | 2 | zlv | 1 | | 2 | zlv enter | 1 | +--------+-----------+-----+