2017-07-29 101 views
0

我的表是这样的随机选择4行:使用内部连接

test_ques 
------------------------------ 
id | ques | skill_id 
1 | xyz | 1 
2 | xyz | 1 
3 | xyz | 1 
4 | xyz | 1 
5 | xyz | 1 
6 | xyz | 2 
7 | xyz | 2 
8 | xyz | 2 
9 | xyz | 2 
10 | xyz | 2 
11 | xyz | 2 
12 | xyz | 3 
13 | xyz | 3 
14 | xyz | 3 
15 | xyz | 3 
16 | xyz | 3 
17 | xyz | 3 

skills 
------------ 
id | score 
1 | 15 
2 | 20 
3 | 25 

我要选择的每4个随机行从表test_ques skill_id也

我不知道该怎么做上面的,并得到使用内部连接也可以从技能表中得分。

回答

0

可以为每台skill_id也存储IDS使用GROUP_CONCAT()RAND()有序的字符串。然后使用FIND_IN_SET()将该子查询与表中第一个4选择一起加入。

select q.* 
from (
    select skill_id, group_concat(id order by rand()) as ids 
    from test_ques 
    group by skill_id 
) sub 
join test_ques q 
    on q.skill_id = sub.skill_id 
    and find_in_set(q.id, sub.ids) <= 4 

http://sqlfiddle.com/#!9/55730/6

+0

完美地工作,但这个查询可以更简单吗? –

+0

@ιηςπεδιδιυζαυπαυ我不知道更简单的方法(在一个查询中)。如果有人发现,我想看看它。 –

+0

请检查我更新的问题。 –

0

在MySQL中,最简单的方法就是枚举每个skill_id行,然后选择四:

select t.* 
from (select t.*, 
      (@rn := if(@s = skill_id, @rn + 1, 
         if(@s := skill_id, 1, 1) 
         ) 
      ) as rn 
     from test_ques t cross join 
      (select @s := -1, @rn := 0) params 
     order by skill_id, rand() 
    ) t 
where rn <= 4; 
+0

该查询返回每次相同的行,随机。 –

+0

您可以为随机数生成器生成种子,但它不应该返回相同的行。 –

+0

检查保罗的答案。这是一个好方法。 –