2016-07-12 2 views
0

Я использую moodle Multitrack тест для разработки теста оценки карьеры. Я хочу изменить плагин, чтобы отображать случайные вопросы, по одному вопросу за раз. Так что если есть в общей сложности 10 вопросов, тогда он должен сначала показать случайный вопрос, и после его сохранения затем отобразить случайный вопрос из оставшихся 9 вопросов и так далее. Вопросы сохраняются в таблице под названием «magtest_question», поля которой являются:Показать случайные вопросы из таблицы без повторения

id(bigint), 
magtestid(bigint), 
questiontext(longtext), 
questiontextformat(mediumint), 
sortorder(bigint). 

Вопросы сортируются на основе столбца «SortOrder». Поэтому я попытался изменить запрос для сортировки случайным образом.

SELECT * FROM {magtest_question} WHERE magtestid=? ORDER BY RAND() 

Но это будет иногда снова показывать тот же вопрос. Я хочу избежать вопросов, которые предпринимаются. Как я могу достичь этого с помощью SQL-запроса. Пожалуйста помоги.

+1

это не будет показывать один и тот же вопрос снова. Это можно использовать для построения массива вопросов, упорядоченных случайным образом. Тот же эффект может быть достигнут с помощью (например) функции Shuffle PHP. – Strawberry

+0

+1 для клубники ответить. Проверьте наличие повторяющихся значений в таблице данных. Указанный запрос не должен давать повторяющиеся значения. – Djeramon

+0

@Djeramon Я пробовал с 5 вопросами, и он снова показывает тот же вопрос. – user1690835

ответ

1

Запросить идентификаторы всех 10 вопросов в произвольном порядке, сохранить идентификаторы в сеансе в массиве в порядке, возвращаемом запросом, и затем поочередно получать вопросы. Таким образом, вы запрашиваете только вопрос order by rand(), и вопросы не будут повторяться.

+0

Существует пейджинг. Я хочу показать только один вопрос за раз. Поэтому запрос будет необходим. – user1690835

+0

Это решение - лучший подход. Сделайте RAND() в SQL только для получения идентификаторов в массиве сеансов. Затем вы читаете свой массив идентификаторов вопроса, и для каждого из них вы делаете запрос на получение информации для этого идентификатора. Вот как это должно быть, и пейджинг не является проблемой –

+0

@ThomasG Да. Это нормально только по одному вопросу за раз. Нет. вопросов на странице - это динамическое значение. Поэтому в любое время в будущем, если я хочу изменить нет. вопросов на странице, тогда это будет проблемой. – user1690835

0

Вы должны исключить вопросы, которые уже даны ответы

Что-то вроде

$sql = "SELECT q.* 
     FROM {magtest_question} q 
     WHERE q.magtestid = :magtestid 
     AND NOT EXIST (SELECT a.id 
         FROM {magtest_answer} a 
         WHERE a.questionid = q.id 
         AND a.userid = :userid) 
     ORDER BY RAND()"; 

$params = array('magtestid' => $magtest->id, 'userid' => $USER->id); 

$questions = $DB->get_records_sql($sql, $params, $currentpage * $magtest->pagesize, $magtest->pagesize); 
+0

Как я могу сделать пейджинг здесь? – user1690835

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