MySQL получает подмножество инструкции select на основе содержимого

#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

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 за раз