Когда таблица большая и сбор более непредсказуемый, нумерация строк должна быть упорядочена по типу во внутреннем запросе, чтобы побочные эффекты работали.
select id, title, type
from (select id, title, type,
@r := CASE WHEN @g = type THEN @r+1 ELSE 1 END r,
@g := type
from tbl
order by type, title) as x
where row_number <= 3
# order by type, title
Другой способ сделать это без использования побочных эффектов, если нет двух одинаковых записей (title, type, id), приведен ниже. При этом используется только стандартный ANSI SQL92 SQL. Это может быть медленнее, чем выше.
select A.id, A.title, A.type
from tbl A
left join tbl B on
A.title = B.title and
(A.type < B.type or
(A.type = B.type and A.id < A.id))
group by A.id, A.title, A.type
having count(B.title) <= 2