感谢您的关注,我正在尝试从数据库中随机获取20个条目并且是唯一的,因此同一个条目不会出现两次。但我也有一个questionGroup字段,也不应该出现两次。我希望将该字段区分开来,然后获取所选字段的ID。
下面是我的NOT WORKING脚本,因为它的ID也是不同的
SELECT DISTINCT `questionGroup`,`id`
FROM `questions`
WHERE `area`='1'
ORDER BY rand() LIMIT 20
非常感谢任何建议!
由于
答案 0 :(得分:2)
尝试在子查询中首先使用/ 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,每个分组平均取两个(但它是随机的,所以有时候是0,1,2等)。它选择了这些的max()。如果没有,则需要最小值。
这将略微偏离最大id(或最小值,如果你切换等式中的min和max)。对于大多数应用程序,我不确定这种偏差会产生很大的影响。在支持排名功能的其他数据库中,您可以直接解决问题。
答案 1 :(得分:0)
像这样的东西
SELECT DISTINCT *
FROM (
SELECT `questionGroup`,`id`
FROM `questions`
WHERE `area`='1'
ORDER BY rand()
) As q
LIMIT 20