2012-07-29 139 views
0

感谢您的期待,我试图从数据库中随机获取20个条目并且是唯一的,因此同一个条目不会出现两次。但我也有一个questionGroup字段,它也不应该出现两次。我想让这个字段不同,但是然后得到所选字段的ID。SQL Distinct - 获取所有值

下面是我不工作的脚本,因为它的ID为不同过于其中

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

任何建议,非常感谢!

感谢

+0

你能给设置一些样本数据和样本的结果?从这个问题来看,你不清楚你究竟瞄准了什么。 – Vitaliy 2012-07-29 17:59:23

回答

2

尝试通过/不同的第一子查询从事群体:

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,等) 。它选择这些的最大值()。如果没有出现,那么它会占用最小的。

这会稍微偏离最大值(或最小值,如果您在等式中切换最小值和最大值)。对于大多数应用程序,我不确定这种偏见会造成很大的差异。在其他支持排名功能的数据库中,您可以直接解决问题。

+0

不错的概念,但它不会工作,因为你从某个地方选择了一切,只有你选择了不同的组和ID。 ID不需要明确,因为它然后查找ID和问题组不同,这是不可能的,因为ID是唯一的。所以我只需要不同的问题组,但想要拉ID的结果 – DugoutSoccer 2012-07-29 17:40:59

0

像这样的事情

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

我正在寻找的结果将需要像选择不同('questionGroup'),'ID'但不幸你不能这样做作为查询:( – DugoutSoccer 2012-07-29 17:44:40