MySQL / Moodle - Заменить значение в одном поле индексом текстового поля с разделителями в виде трубы

0

Я пытаюсь извлечь вопросы и ответы на вопросы, используя 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 с разделителями каналов.

Есть ли у кого-нибудь опыт такого рода извлечения?

Спасибо!

Теги:
moodle

1 ответ

0

Кажется, я нашел ответ.

Итак, я могу в основном узнать, сколько ответов я отвечу на конкретный курс, используя 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

Это немного грязно, и я всегда буду проверять, сколько альтернатив есть заранее, но он выполняет свою работу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню