サブクエリで最初にgroupby/distinctを実行してみてください。
select *
from (select distinct `questionGroup`,`id`
from `questions`
where `area`='1'
) qc
order by rand()
limit 20
そうか 。。。必要なのは、各グループからランダムな行を選択し、それを20グループに制限することです。これはもっと難しい問題です。変数や外部テーブルを使用せずに、mysqlの単一のクエリでこれを正確に実行できるかどうかはわかりません。
概算は次のとおりです。
select *
from (select `questionGroup`
coalesce(max(case when rand()*num < 1 then id end), min(id)) as id
from `questions` q join
(select questionGroup, count(*) as num
from questions
group by questionGroup
) qg
on qg.questionGroup = q.questionGroup
where `area`='1'
group by questionGroup
) qc
order by rand()
limit 20
これは、rand()を使用してIDを選択し、グループごとに平均2つを取得します(ただし、ランダムであるため、0、1、2などの場合もあります)。これらのmax()を選択します。何も表示されない場合は、最小値を取ります。
これは、最大ID(または、方程式の最小値と最大値を切り替える場合は最小値)からわずかにバイアスされます。ほとんどのアプリケーションでは、このバイアスが大きな違いを生むかどうかはわかりません。ランキング機能をサポートする他のデータベースでは、問題を直接解決できます。