Подскажите как составить запрос - MySQL (219558)

Узнай цену своей работы

Формулировка задачи:

Привет! Есть два таблицы:
Листинг программы
  1. +-------------+------------------+------+-----+---------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +-------------+------------------+------+-----+---------+----------------+
  4. | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
  5. | question | varchar(255) | NO | | NULL | |
  6. | parent_test | int(11) | NO | | NULL | |
  7. +-------------+------------------+------+-----+---------+----------------+
*
Листинг программы
  1. +-----------------+------------------+------+-----+---------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +-----------------+------------------+------+-----+---------+----------------+
  4. | id | int(10) unsigned | NO | PRI | NULL | auto_increment |
  5. | answer | text | NO | | NULL | |
  6. | parent_question | int(10) unsigned | NO | | NULL | |
  7. | correct_answer | enum('0','1') | NO | | 0 | |
  8. +-----------------+------------------+------+-----+---------+----------------+
в первой вопросы во второй по три (иногда четыре) варианта ответа. Это тест. Запрс
Листинг программы
  1. SELECT q.question, q.parent_test, a.id, a.answer, a.parent_question from questions q left join answers a on q.id = a.parent_question where q.parent_test=1 order by rand();
перемешивал вопросы выводя в случайном порядке вопросы и варианты ответов тоже в случайном порядке. Пока вопросов было 10-20 все было хорошо, но сейчас вопросов больше 100 и необходимо ограничить их кол-во 25. Я понимаю что нужен подзапрос - но пробую разные варианты ничего не получается - то выводит 25 вопросов и по одному варианту ответов, то перемешивает все в кучу! Подскажите как составить запрос чтобы выбирало 25 вопросов в случайном порядке из первой таблицы и к ним варианты ответов из второй таблицы соответствующие вопросам. Хочется одним запросом, на стороне БД. Не хочется городить цикл PHP из 25 запросов к бд за ответами!

Решение задачи: «Подскажите как составить запрос»

textual
Листинг программы
  1. SELECT q.question, q.parent_test, a.id, a.answer, a.parent_question from questions q left join answers a  on q.id = a.parent_question where q.parent_test=1 and q.id in($id)order by rand();

Объяснение кода листинга программы

В данном коде выполняется запрос к базе данных, используя язык SQL. В запросе используются следующие действия:

  1. SELECT - выбор данных из таблицы.
  2. q.question, q.parent_test, a.id, a.answer, a.parent_question - выбор конкретных столбцов для вывода.
  3. FROM - указание источника данных, в данном случае таблицы questions и answers.
  4. LEFT JOIN - объединение данных из двух таблиц по общему столбцу.
  5. ON - указание условия для объединения строк из разных таблиц.
  6. WHERE - установка условия для выбора данных.
  7. q.parent_test=1 - выбираются только строки, где значение столбца parent_test равно 1.
  8. q.id in($id) - выбираются только строки, где значение столбца id входит в список, представленный в переменной $id.
  9. ORDER BY - сортировка результатов запроса по указанному столбцу.
  10. rand() - сортировка производится случайным образом. Список переменных и их значений:
  11. $id - переменная, содержащая список id для выборки.
  12. q.parent_test - столбец с тестами.
  13. q.id - столбец с идентификаторами вопросов.
  14. a.id - столбец с идентификаторами ответов.
  15. a.answer - столбец с самими ответами.
  16. a.parent_question - столбец с идентификаторами вопросов, к которым относятся ответы.
  17. q.parent_test=1 - условие для выбора тестов.
  18. q.id in($id) - условие для выбора вопросов по списку id.
  19. ORDER BY rand() - сортировка результатов запроса случайным образом.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут