Это должно сделать трюк. Во внутреннем запросе вы получаете ответы только на конкретный вопрос и во внешнем запросе, когда вы группируете по записи, вы избавляетесь от нулевых значений ... Попробуйте запустить только внутренний запрос, чтобы получить эту идею.
select
max(q.Question1),
max(q.Question2),
max(q.Question3) FROM (SELECT
recordid,
case when question = 'Question 1' then answer else null end as Question1,
case when question = 'Question 2' then answer else null end as Question2,
case when question = 'Question 3' then answer else null end as Question3 FROM questions) q group by q.recordid
Сообщите мне, если у вас есть quesitons!
EDIT: Ваш комментарий добавляет еще один уровень сложности :) Теперь я вижу, как мы можем использовать этот порядок сортировки ... Нам нужен еще один внутренний запрос, чтобы получить вопросы и порядок их сортировки. Затем получите ответы на каждый порядок сортировки, а затем группируйте по идентификатору записи, чтобы отфильтровать нули и получить желаемый результат. Пожалуйста, попробуйте это и дайте мне знать, как это происходит ... Количество вопросов в предложениях выбора должно быть равно количеству вопросов формы, в которых больше всего вопросов - я поставил 8, чтобы показать вам что это не должно сдерживать вас. Теперь вы не будете зависеть от имени вопроса - просто нумерация сортировки. Это хорошо, что у вас есть порядок сортировки - в противном случае вам придется сгенерировать номер строки на каждый идентификатор записи ...
SET @rank=0; SET @id:=0; select recordid, max(qq.question1) as 'Question 1', max(qq.question2) as 'Question 2', max(qq.question3) as 'Question 3', max(qq.question4) as 'Question 4', max(qq.question5) as 'Question 5', max(qq.question6) as 'Question 6', max(qq.question7) as 'Question 7', max(qq.question8) as 'Question 8' FROM ( SELECT recordid, case when q.rownumber = 1 then CONCAT(question,': ', answer) else null end as question1, case when q.rownumber = 2 then CONCAT(question,': ', answer) else null end as question2, case when q.rownumber = 3 then CONCAT(question,': ', answer) else null end as question3, case when q.rownumber = 4 then CONCAT(question,': ', answer) else null end as question4, case when q.rownumber = 5 then CONCAT(question,': ', answer) else null end as question5, case when q.rownumber = 6 then CONCAT(question,': ', answer) else null end as question6, case when q.rownumber = 7 then CONCAT(question,': ', answer) else null end as question7, case when q.rownumber = 8 then CONCAT(question,': ', answer) else null end as question8 FROM( select recordid, question, answer, sortorder, @rank:=CASE WHEN @id=recordid THEN @rank+1 ELSE 1 END as rownumber, @id:=recordid from questions order by recordid, sortorder ) q )qq GROUP BY recordid
Вам нужно [UNPIVOT] (http://stackoverflow.com/questions/15184381/mysql-turn-table-into-different-table)! –
Hi Maciej Los, хм, я не уверен. Проверьте мой отредактированный вопрос. – Ralph
Вы отметили PHP, так что обращайтесь с презентацией. ПРАВИЛЬНО, RECORDID НЕ всегда уникален! – Strawberry