2017-07-29 2 views
0

Mein Tisch ist wie folgt:Wählen random 4 Zeilen mit INNER JOIN

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 

I 4 Zufallsreihen jeweils aus Tabelle test_ques

skill_id auswählen möchten

Ich frage mich, wie die oben genannten zu tun und bekommen Punktzahl aus Skills-Tabelle auch mit inneren Join.

Antwort

0

können Sie speichern die IDs für jeden skill_id in einem String GROUP_CONCAT() von RAND() bestellt werden. Dann verbinden Sie die Unterabfrage mit der Tabelle, die zuerst 4 mit FIND_IN_SET() auswählt.

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

Funktioniert perfekt, aber kann diese Abfrage einfacher sein? –

+0

@ ιηςπεδιδιεζαυπαυ Ich kenne keinen einfacheren Weg (in einer Abfrage). Wenn jemand einen findet, würde ich es gerne sehen. –

+0

Bitte überprüfen Sie meine aktualisierte Frage. –

0

In MySQL, die einfachste Methode ist es, die Reihen für jede skill_id aufzuzählen und dann vier wählen:

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

Diese Abfrage liefert die gleichen Zeilen jedes Mal, nach dem Zufall. –

+0

Sie können den Zufallszahlengenerator seed, aber es sollte nicht die gleichen Zeilen zurückgeben. –

+0

Überprüfen Sie die Antwort von Paul. Es ist ein guter Ansatz. –