Я пытаюсь извлечь вопросы и ответы на вопросы, используя SQL, с сервера Moodle, расположенного в базе данных MySQL. (Moodle Version 3.1.7 (Build: 20170710))
В таблице mdl_feedback_item
хранятся вопросы, в то время как ответы получены через соединение с таблицей mdl_feedback_value
.
Это мой текущий скрипт sql:
select fi.id, fi.name as fb_question, fi.presentation as answer_options, fv.value as answer
from mdl_feedback fb
left join mdl_feedback_item fi on fi.feedback=fb.id
left join mdl_feedback_value fv on fv.item=fi.id
Результат:
id/fb_question/answer_options/answer
68/Do you.../Agree|Neutral|Disagree/3
69/Are you.../Yes|No|Maybe/1
70/Which day.../Monday|Tuesday/2
(...)
Моя цель - проверить значение "ответ" и заменить его соответствующим answer_option: id/fb_question/answer_options/answer
68/Do you.../Agree|Neutral|Disagree/Disagree
69/Are you.../Yes|No|Maybe/Yes
70/Which day.../Monday|Tuesday/Tuesday
Не существует минимального/максимального количества альтернатив для каждого вопроса, поэтому я думаю, что мне нужно проверить значение "ответ", а затем сопоставить его с соответствующей позицией в столбце answer_options с разделителями каналов.
Есть ли у кого-нибудь опыт такого рода извлечения?
Спасибо!
Кажется, я нашел ответ.
Итак, я могу в основном узнать, сколько ответов я отвечу на конкретный курс, используя LENGTH:
Max((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1) as max_num_options,
Пусть говорят, что результат равен 5.
Поэтому я использую SUBSTRING_INDEX в операторе CASE, который даст мне значения для каждой из 5 альтернатив.
CASE
WHEN fv.value = 1 THEN (IF(SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', ((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)), '|', -1 ) = SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', (((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)-1)), '|', -1),"",SUBSTRING_INDEX( SUBSTRING_INDEX(fi.presentation, '|', 1), '|', -1 )))
WHEN fv.value = 2 THEN (IF(SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', ((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)), '|', -1 ) = SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', (((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)-1)), '|', -1),"",SUBSTRING_INDEX( SUBSTRING_INDEX(fi.presentation, '|', 2), '|', -1 )))
WHEN fv.value = 3 THEN (IF(SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', ((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)), '|', -1 ) = SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', (((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)-1)), '|', -1),"",SUBSTRING_INDEX( SUBSTRING_INDEX(fi.presentation, '|', 3), '|', -1 )))
WHEN fv.value = 4 THEN (IF(SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', ((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)), '|', -1 ) = SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', (((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)-1)), '|', -1),"",SUBSTRING_INDEX( SUBSTRING_INDEX(fi.presentation, '|', 4), '|', -1 )))
WHEN fv.value = 5 THEN (IF(SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', ((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)), '|', -1 ) = SUBSTRING_INDEX(SUBSTRING_INDEX(fi.presentation, '|', (((LENGTH(fi.presentation) - LENGTH(REPLACE(fi.presentation, '|', '')))+1)-1)), '|', -1),"",SUBSTRING_INDEX( SUBSTRING_INDEX(fi.presentation, '|', 5), '|', -1 )))
ELSE 'No answer given/text field'
END AS fv_response_text
Это немного грязно, и я всегда буду проверять, сколько альтернатив есть заранее, но он выполняет свою работу.