2017-02-02 1 views
2

데이터 방식으로 그들을 트랜스 : 세션의 난 (lvlid1, lvlid2, lvlid3, lvlid4)에 레벨 테이블에서 4 개 임의의 서로 다른 ID를 선택하려면 어떻게MYSQL - 4 개 임의의 행을 선택하고 삽입 문을 열

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

당신은 별도의 열 네 개의 무작위 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 개의 랜덤은 1, 2, 3, 4를 포함하지 않을 것입니다. 그러나 나는 그것을 효과가있게 만들었다. – rotanov

+0

예 : 이처럼 https://gist.github.com/rotanov/c6b53600daca159be3c2694c61774b69 – rotanov

+0

나는 더 많은 생각을했고 지금은 네가 't2.rn limit 4'를 생략하거나'limit 4 '다시 가장 안쪽으로 선택하십시오. 나는 어떤 것이 성능면에서 더 좋은지 모른다. – rotanov

관련 문제