0

感谢您的关注,我正在尝试从数据库中随机且唯一地获取 20 个条目,因此相同的条目不会出现两次。但我也有一个 questionGroup 字段,它也不应该出现两次。我想让该字段与众不同,然后获取所选字段的 ID。

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

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

非常感谢任何建议!

谢谢

4

2 回答 2

2

尝试在子查询中先进行 group by/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(或最小值,如果您在等式中切换最小值和最大值)。对于大多数应用程序,我不确定这种偏差是否会产生重大影响。在其他支持排名功能的数据库中,可以直接解决问题。

于 2012-07-29T17:37:13.100 回答
0

像这样的东西

SELECT DISTINCT *
FROM (
    SELECT `questionGroup`,`id` 
    FROM `questions`
    WHERE `area`='1' 
    ORDER BY rand()
) As q
LIMIT 20
于 2012-07-29T17:39:52.380 回答