感谢您的查询,我试图从数据库中随机且唯一地获取20个条目,因此同一条目不会出现两次。但是我还有一个questionGroup字段,该字段也不应出现两次。我想使该字段与众不同,但随后获取所选字段的ID。

以下是我的NOT WORKING脚本,因为它的ID也与众不同

SELECT DISTINCT `questionGroup`,`id`
FROM `questions`
WHERE `area`='1'
ORDER BY rand() LIMIT 20


任何建议,不胜感激!

谢谢

最佳答案

尝试先在子查询中进行分组依据/区分:

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(或最小,如果您在方程式中切换最小值和最大值),将略有偏差。对于大多数应用程序,我不确定这种偏向是否会带来很大的不同。在其他支持排名功能的数据库中,您可以直接解决问题。

10-08 07:19
查看更多