尝试通过/不同的第一子查询从事群体:
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
这使用兰特()来选择一个id,同时,平均每两个分组(但它是随机的,所以有时0,1,2,等) 。它选择这些的最大值()。如果没有出现,那么它会占用最小的。
这会稍微偏离最大值(或最小值,如果您在等式中切换最小值和最大值)。对于大多数应用程序,我不确定这种偏见会造成很大的差异。在其他支持排名功能的数据库中,您可以直接解决问题。
你能给设置一些样本数据和样本的结果?从这个问题来看,你不清楚你究竟瞄准了什么。 – Vitaliy 2012-07-29 17:59:23