2017-02-02 4 views
2
схемы

данных: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) 
); 

Как выбрать 4 случайные различные идентификаторы из таблицы уровня в (lvlid1, lvlid2, lvlid3, lvlid4) заседаний Таблица? Более конкретно я хочу знать, если это возможно, чтобы сделать что-то вроде этого:

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

ответ

1

Вы можете быть в состоянии использовать запрос поворота с динамическим переменным номером строки, чтобы выбрать четыре случайных идентификаторов в отдельных столбцах.

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

Спасибо! У меня появилась идея. Но вам нужно разделить самый внутренний выбор на два, чтобы заставить его работать. Он назначает row_number сначала, и 4 случайных не будут содержать 1, 2, 3, 4 точно, как сейчас. Но мне удалось заставить его работать. – rotanov

+0

, например. например https://gist.github.com/rotanov/c6b53600daca159be3c2694c61774b69 – rotanov

+0

Я дал ему больше мысли, и теперь я думаю, что с еще одним выбором вы можете вообще опустить 'order by t2.rn limit 4' или переместить только' limit 4 'обратно во внутренний выбор. Я не знаю, что лучше. – rotanov

 Смежные вопросы

  • Нет связанных вопросов^_^