Może się komuś sprzyda.
Pierwsze zapytanie ma jedną wadę, otóż subselect musi pobrać wszystkie rekordy i ponumerować od 1 do n, dopiero w selekcie zewnętrznym są brane interesujące nas wyniki w naszym przypadku do 2 odpowiedzi na posta.
mysql> SELECT forumId, parentForumId from (
-> SELECT forumId, parentForumId, IF( @tmp <> parentForumId, @row := 1, @row := @row + 1 ) AS row_number, @tmp := parentForumId from `groupForum` where parentForumId in(30,31) order by parentForumId asc) t
-> WHERE t.row_number <= 2;
+---------+---------------+
| forumId | parentForumId |
+---------+---------------+
| 106 | 30 |
| 134 | 30 |
| 632 | 31 |
| 638 | 31 |
+---------+---------------+
4 rows in set (0.00 sec)
mysql> set @row = 0,@tmp=0;
Query OK, 0 rows affected (0.00 sec)
Wynik można uzyskać przenosząc liczenie odpowiedzi do where, zysk mamy taki że jeżeli @row przekracza 2 pomijane są następne rekordy aż napotkamy następny post i liczenie zacznie się od nowa
mysql> SELECT forumId, @tmp := parentForumId as parentForumId from `groupForum`
-> where parentForumId in(30,31) and IF( @tmp <> parentForumId, @row := 1, @row := @row + 1 ) <=2 order by parentForumId asc;
+---------+---------------+
| forumId | parentForumId |
+---------+---------------+
| 106 | 30 |
| 134 | 30 |
| 632 | 31 |
| 638 | 31 |
+---------+---------------+
4 rows in set (0.00 sec)
Ten sposób można wykorzystać zamiast GROUP BY lub DISTINCT i całkiem dobrze sobie to radzi