SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.04.2025 18:56:56

Mahhono
Участник
Зарегистрирован: 04.04.2025
Сообщений: 5

как получить в запросе перемешанную родительскую и дочернюю таблицы?

Приветствую.
Есть БД тестов с несколькими подчиненными таблицами

    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) На выходе получить сгруппированные по Подразделам перемешанные вопросы и перемешанные к ним ответы.

Может надо структуру БД изменить. Опыта нет, делаю "с колес". Сделал так , как показалось оптимальным. Остальные сортировки уже осилил, с этими засада, в интернете аналогов своей хотелке не нашел пока. Спасибо.

Неактивен

 

#2 04.04.2025 20:58:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

Не ясно, что такое "перемешанные вопросы и перемешанные к ним ответы".
Дополните пример тестовыми данными на несколько строк (insert into) и какой результат должен быть для этих данных.

Неактивен

 

#3 04.04.2025 21:08:37

Mahhono
Участник
Зарегистрирован: 04.04.2025
Сообщений: 5

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

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

программер я еще тот, пятый день приседаю, поэтому если пару слов о корректности напишет, буду благодарен

Неактивен

 

#4 04.04.2025 21:15:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

Тогда так:

SELECT ... FROM tests_questions LEFT JOIN tests_answers ON id_q = id_q_a ORDER BY RAND()

Неактивен

 

#5 04.04.2025 21:37:32

Mahhono
Участник
Зарегистрирован: 04.04.2025
Сообщений: 5

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

хорошо, попробую, спасибо.
это для общего перемешивания.
Осталось перемешать по подразделам, ночь длинна)))

Неактивен

 

#6 04.04.2025 21:46:11

Mahhono
Участник
Зарегистрирован: 04.04.2025
Сообщений: 5

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

vasya написал:

Тогда так:

SELECT ... FROM tests_questions LEFT JOIN tests_answers ON id_q = id_q_a ORDER BY RAND()

здесь строки вопрос-ответ полностью перемешиваются, вопросы не сгруппированы по id. Но за совет спасибо, положу в копилку).

Неактивен

 

#7 04.04.2025 21:48:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5847

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

... ORDER BY id_subject_v, RAND()

Неактивен

 

#8 05.04.2025 18:15:46

Mahhono
Участник
Зарегистрирован: 04.04.2025
Сообщений: 5

Re: как получить в запросе перемешанную родительскую и дочернюю таблицы?

проблема решена.
Огромное спасибо товарищу с ником "Аватар" из киберфорума за его помощь. На всякий случай сюда дублирую его:
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()

тема закрыта. Спасибо всем откликнувшимся.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson