2017-02-02 6 views
2

データスキームにそれらをトランスポーズ:セッションの私は(lvlid1、lvlid2、lvlid3、lvlid4)にレベルテーブルから4つのランダムに異なるIDを選択するにはどうすればよいMYSQL - 4つのランダムな行を選択し、INSERT文の列

create table level (
    id int auto_increment primary key, 
    # ... other data which is not relevant 
); 

create table session (
    id int auto_increment primary key, 
    lvlid1 int not null, 
    lvlid2 int not null, 
    lvlid3 int not null, 
    lvlid4 int not null, 
    ts timestamp not null default current_timestamp, 
    foreign key(lvlid1) references level(id), 
    foreign key(lvlid2) references level(id), 
    foreign key(lvlid3) references level(id), 
    foreign key(lvlid4) references level(id) 
); 

表? は、具体的には、私はそれが可能このような何かをするかどうかを知りたい:

insert into session (lvlid1, lvlid2, lvlid3, lvlid4) 
values(TRANSPOSE(select id from level order by rand() limit 4)) 

答えて

1

あなたが別々の列に4つのランダムなIDを選択するために、動的な行番号変数とピボットクエリを使用することができるかもしれません。

SET @row_number = 0; 

INSERT INTO session (lvlid1, lvlid2, lvlid3, lvlid4) 
SELECT MAX(CASE WHEN t2.rn = 1 THEN t2.id END), 
     MAX(CASE WHEN t2.rn = 2 THEN t2.id END), 
     MAX(CASE WHEN t2.rn = 3 THEN t2.id END), 
     MAX(CASE WHEN t2.rn = 4 THEN t2.id END) 
FROM 
(
    SELECT t.id, (@row_number:[email protected]_number + 1) AS rn 
    FROM 
    (
     SELECT id FROM lv_kb00_level ORDER BY RAND() 
    ) AS t 
) AS t2 
+0

ありがとうございます!私はその考えを得た。しかし、最も内側の選択肢を2つに分割して機能させる必要があります。これは、row_numberを最初に割り当て、4つのrandomに1,2,3,4が含まれないようになりました。しかし、私はそれを動作させることができました。例えば、 – rotanov

+0

。このようにhttps://gist.github.com/rotanov/c6b53600daca159be3c2694c61774b69 – rotanov

+0

私はそれ以上の考えを与えて、今私はあなたが 't2.rn limit 4'をすべて省略するか、単に 'limit 4 「最奥の選択に戻る。私はどちらがパフォーマンス的に優れているか分かりません。 – rotanov

関連する問題