2017-07-29 60 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

檢查保羅的答案。這是一個好方法。 –