#mysql
#mysql
Вопрос:
Я создал опрос, который пользователи могли заполнить. Вопрос 0 является ведущим вопросом, который имеет 4 варианта. В зависимости от того, какой вариант они выбирают, они получают другое подмножество вопросов. ЕСЛИ они решат, они могут нажать кнопку возврата браузера к вопросу 0 и выбрать другое подмножество. Это перезаписывает их ответ на вопрос 0, и их другие вопросы опроса регистрируются. Если пользователь был особенно непослушен, он мог ответить на все 11 вопросов, и таким образом, у него было создано по 1 записи для каждого возможного вопроса.
Проблема в том, что мне нужно сообщить об опросах. Если я сделаю прямую сумму всех ответов на вопрос 1, в нее войдут те люди, которые с тех пор изменили свое мнение. Мне нужно выполнить инструкцию select, которая учитывает их наводящий вопрос и выбирает их набор опросов, связанный с этим.
Вот этот необычный код, который я сделал некоторое время назад, он создает действительно хорошую итоговую сетку для всех вопросов и ответов. Хотя это не делает того, что я прошу.
select distinct user_id, q_id,
sum(IF(answer like '%A%',1,0)) as A,
sum(IF(answer like '%B%',1,0)) as B,
sum(IF(answer like '%C%',1,0)) as C,
sum(IF(answer like '%D%',1,0)) as D,
sum(IF(answer like '%E%',1,0)) as E,
sum(IF(answer like '%F%',1,0)) as F
from user_answers as t1
join
( select distinct id
from users
WHERE stepflag = 4 //finished the survey
and disq = 0
) inr
on inr.id=t1.user_id
group by q_id;
Существует таблица users, и их идентификаторы регистрируются в таблице ответов как user_id с соответствующими ответами. Надеюсь, я предоставил достаточно информации, спасибо за помощь
Приведенный выше результат запроса, но с раздутыми числами из-за проблемы. Также не спрашивайте меня, как один человек вошел в 1 D.
таблица user_answers
А таблица users — это ваша стандартная таблица типов id, fname, lname, disq, timestamp для сбора пользовательских данных.
Комментарии:
1. Можете ли вы показать образцы данных и желаемый результат?
2. Было бы более полезно просмотреть образец набора данных.
3. Спасибо, я добавил несколько картинок
Ответ №1:
Я разобрался со своим вопросом:
Я плохо разбираюсь в составлении сложных запросов MySQL, поэтому я попытаюсь объяснить это, если это поможет кому-то еще
select t1.q_id,
sum(t1.answer like '%A%') as A,
sum(t1.answer like '%B%') as B,
sum(t1.answer like '%C%') as C,
sum(t1.answer like '%D%') as D,
sum(t1.answer like '%E%') as E,
sum(t1.answer like '%F%') as F
from user_answers t1 join
(select distinct id, `date`
from users
where stepflag = 4 and
disq = 0
) inr
on inr.id = t1.user_id join
user_answers q0
on q0.user_id = t1.user_id and q0.q_id = 0
where (q0.answer = 'A' and t1.q_id in (1, 2, 3, 4)) or
(q0.answer = 'B' and t1.q_id in (5, 6, 7, 8)) or
(q0.answer = 'C' and t1.q_id in (9, 10, 11))
group by t1.q_id;
Я подсчитываю все ответы на основе их значения varchar. Имейте в виду, что это может быть изменено для множественного выбора, если у вас много букв в одном наборе ответов, это просто усложняется.
Волшебство в нижней части. Значение ведущего вопроса A приводит к набору опроса 1-4, B приводит к 5-8, а C приводит к 9-11. D был отклонен, поэтому нет связанного набора опросов.
Выполнение этого запроса занимает много времени, поэтому, если у вас большая база данных, вам, возможно, придется увеличить время ожидания соединения. Я работаю с более чем 20 000 записями и избегаю таймаутов, выполняя только один выбор опроса Q0 за раз