Търсите ли това?
SELECT rn, id, category_id, title
FROM
(
SELECT *, @a := IF(@c = category_id, @a + 1, 1) rn, @c := category_id
FROM photos CROSS JOIN (SELECT @c := NULL, @a := 0) i
ORDER BY category_id
) q
WHERE rn <= 4;
Изход:
<преди>| RN | ID | CATEGORY_ID | ЗАГЛАВИЕ ||----|----|-------------|--------|| 1 | 43 | 1 | Заглавие1 || 1 | 28 | 2 | Заглавие2 || 2 | 42 | 2 | Заглавие3 || 1 | 11 | 3 | Заглавие4 || 1 | 3 | 4 | Заглавие5 || 2 | 29 | 4 | Заглавие6 || 3 | 33 | 4 | Заглавие7 |Ето го SQLFiddle демонстрация
Ето поправка за вашия код, за да произвежда правилните номера на редове
SET @a:=0;
SET @cid:=0;
SELECT @a, @cid, q.*, @cid:=q.category_id FROM (
SELECT *
FROM photos
ORDER BY category_id
) AS q
WHERE @a := IF(@cid=q.category_id, @a+1, 1)
Ето го SQLFiddle демонстрация
Редът на изпълнение на SQL израз има значение.