![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Приветствую.
Есть БД тестов с несколькими подчиненными таблицами
CREATE TABLE IF NOT EXISTS tests_subjects(
id_subject INT(1) NOT NULL AUTO_INCREMENT PRIMARY KEY,
subject VARCHAR(100) NOT NULL COMMENT 'Раздел'
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS tests_subjects_variants(
id_subject_v INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_subject INT(1) NOT NULL COMMENT 'внеш ключ',
FOREIGN KEY (id_subject) REFERENCES tests_subjects(id_subject),
subject_v VARCHAR(100) NOT NULL COMMENT 'Раздел'
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS tests_questions(
id_question INT(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_subject INT(1) NOT NULL COMMENT 'внеш ключ s',
FOREIGN KEY (id_subject) REFERENCES tests_subjects(id_subject),
id_subject_v INT(2) NOT NULL COMMENT 'внеш ключ s_v',
FOREIGN KEY (id_subject_v) REFERENCES tests_subjects_variants(id_subject_v),
caption VARCHAR(700) NOT NULL COMMENT 'Вопрос',
type VARCHAR(10) NOT NULL COMMENT 'тип данных'
) ENGINE=INNODB;
CREATE TABLE IF NOT EXISTS tests_answers(
id_answer INT(1) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Ответы',
id_question INT(3) NOT NULL COMMENT 'внеш ключ',
FOREIGN KEY (id_question) REFERENCES tests_questions(id_question),
answer VARCHAR(500) NOT NULL COMMENT 'Ответ',
is_correct INT(1) NOT NULL COMMENT '1/0'
) ENGINE=INNODB;
То есть первая таблица - Разделы
Вторая таблица (дочерняя от Разделы) - Подразделы
Третья таблица (дочерняя от Подразделы) - Вопросы
Четвертая таблица (дочерняя от Вопросы) - Ответы
Прошу помочь сформировать два запроса -
1) На выходе получить просто все перемешанные вопросы и перемешанные к ним ответы.
2) На выходе получить сгруппированные по Подразделам перемешанные вопросы и перемешанные к ним ответы.
Может надо структуру БД изменить. Опыта нет, делаю "с колес". Сделал так , как показалось оптимальным. Остальные сортировки уже осилил, с этими засада, в интернете аналогов своей хотелке не нашел пока. Спасибо.
Неактивен
Не ясно, что такое "перемешанные вопросы и перемешанные к ним ответы".
Дополните пример тестовыми данными на несколько строк (insert into) и какой результат должен быть для этих данных.
Неактивен
SELECT * FROM (
SELECT tests_questions.id_question id_q, tests_questions.caption a_c
FROM tests_questions
ORDER BY RAND()
) AS tmp_q
LEFT JOIN
(SELECT tests_answers.id_question id_q_a, tests_answers.answer a_a, tests_answers.is_correct as a_is
FROM tests_answers
ORDER BY RAND()
) AS tmp_a
ON id_q = id_q_a
программер я еще тот, пятый день приседаю, поэтому если пару слов о корректности напишет, буду благодарен
Неактивен
Тогда так:
Неактивен
хорошо, попробую, спасибо.
это для общего перемешивания.
Осталось перемешать по подразделам, ночь длинна)))
Неактивен
vasya написал:
Тогда так:
SELECT ... FROM tests_questions LEFT JOIN tests_answers ON id_q = id_q_a ORDER BY RAND()
здесь строки вопрос-ответ полностью перемешиваются, вопросы не сгруппированы по id. Но за совет спасибо, положу в копилку).
Неактивен
... ORDER BY id_subject_v, RAND()
Неактивен
проблема решена.
Огромное спасибо товарищу с ником "Аватар" из киберфорума за его помощь. На всякий случай сюда дублирую его:
create table mytable1 (i int);
create table mytable2 (j int, i int);
create table mytable3 (k int,j int);
insert into mytable1 values(1),(2),(3);
insert into mytable2 values(1,1),(2,1),(3,1),(4,2),(5,2),(6,3);
insert into mytable3 values(1,1),(2,1),(3,1),(4,2),(5,2),(6,3),(7,4),(8,4),(9,4),(10,5),(11,6),(12,6)
select m2.i,m2.j,m3.k
from (select m1.i,(select j from mytable2 where i=m1.i order by rand() limit 1) j from mytable1 m1) m2
join mytable3 m3 on m3.j=m2.j
order by m2.i,rand()
тема закрыта. Спасибо всем откликнувшимся.
Неактивен
Страниц: 1