2016-06-02 7 views
1

Есть и другие вопросы в сводной таблице, но я не могу найти ответ на свой вопрос.Сводная таблица в MySQL

Это мой стол

ID QUESTION  ANSWER  RECORDID  SORTORDER 
1  Question 1  Answer 1.1 123456  1 
2  Question 2  Answer 2.1 123456  2 
3  Question 3  Answer 3.1 123456  3 
4  Question 1  Answer 1.2 654321  1 
5  Question 2  Answer 2.2 654321  2 
6  Question 3  Answer 3.2 654321  3 

Etc.

Я хотел выводить его с запросом к:

Question 1 Question 2 Question 3 
Answer 1.1 Answer 2.1 Answer 3.1 
Answer 1.2 Answer 2.2 Answer 3.2 

Таким образом, в общем, раздел вопросов содержит вопросы, которые не уникально (в этой демонстрации есть 2 записи (см. RECORDID)), поэтому их необходимо сгруппировать и отсортировать по sortorder. RECORDID всегда уникален.

Я видел несколько примеров поворота/неволя, но не могу обогнуть его. Может кто-нибудь мне помочь?

+1

Вам нужно [UNPIVOT] (http://stackoverflow.com/questions/15184381/mysql-turn-table-into-different-table)! –

+0

Hi Maciej Los, хм, я не уверен. Проверьте мой отредактированный вопрос. – Ralph

+0

Вы отметили PHP, так что обращайтесь с презентацией. ПРАВИЛЬНО, RECORDID НЕ всегда уникален! – Strawberry

ответ

1

Это должно сделать трюк. Во внутреннем запросе вы получаете ответы только на конкретный вопрос и во внешнем запросе, когда вы группируете по записи, вы избавляетесь от нулевых значений ... Попробуйте запустить только внутренний запрос, чтобы получить эту идею.

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

+1

Привет, Кошера, большое вам спасибо за попытку найти решение. Проблема в том, что вопросы никогда не предсказуемы, поэтому «Вопрос 1» в запросе не будет работать.Вот что происходит: В этой таблице хранятся записи (набор вопросов с 1 конкретной записью) людей, которые использовали онлайн-форму для отправки этих данных, но пока вопросы в столбце ВОПРОСЫ повторяются (форма имеет определенный набор вопросов), но пользователи могут также заполнить другие формы, которые входят в эту таблицу, а значит, и непредсказуемые вопросы. – Ralph

+0

См. Изменение - я думаю, все должно быть хорошо! Дайте мне знать, как это происходит :) – Koshera

+0

Привет, это почти все! Осталось 2 проблемы: 1. Выходные данные задают вопрос 1, вопрос2 и т. Д., Но не актуальные вопросы (например: имя (вопрос 1), фамилия (вопрос 2) и т. Д.). Я получаю ответы, не зная вопроса. 2. порядок сортировки должен использоваться только для заказа, а не для сопоставления. Поскольку формы редактируются сейчас и затем, порядок сортировки может стать большим (100 или более). Кроме того, он должен быть сгруппирован по определенному вопросу, иначе будут показаны несколько вопросов. Например, имя 2 записи будет выводиться 2x Имя Упование, что у вас есть решение для этого, я уже не могу вас поблагодарить! – Ralph

1

Спасибо всем (особенно! Koshera), с некоторой настройки я получил его чтобы работать так, как я этого хотел.

Это общий код (необработанный, доказательство концепции;)). Функция processQuery - это выполнение PDO try/catch с параметризованным запросом (см. «Placeholder», «raw» $ i не должно быть проблемой?).

<div class="database-container"> 
<table border="0" cellspacing="0" cellpadding="7"> 
<tr> 

<?php 

// get all questions and group them so we only get unique questions 
$getQuestions = processQuery("SELECT ansr_question FROM forms_123456 WHERE is_answer=1 and ansr_type != 'text' GROUP BY ansr_question ORDER BY ansr_sortorder ASC",$param,'fetch-raw',$server,$extra,$DBH); 
unset($param); 

// fetch all the questions 
while($fetchQuestions = $getQuestions->fetch()) 

    { 

     // save into array and generate the column questions 
     $questions[] = $fetchQuestions["ansr_question"]; 
     $question_headers .= '<td height="19" nowrap style="background-color:#e9e9e9; font-weight:400;">'.trim(ucfirst($fetchQuestions["ansr_question"])).'</td>'; 

    } 

// loop array 
$num_questions = count($questions); 
$num_questions_check = $num_questions -1; 
for($i=0; $num_questions > $i; ++$i) 

    { 

    // prepare PDO params 
    $param[] = $questions[$i]; 

    // use the count to perform if statement when last question has been reached 
    $comma = ','; 
    if($num_questions_check == $i) 

     { 
     $comma = ''; 
     } 

    // generate the 2 dynamic parts of the query 
    $sql_part1 .= "max(qq.question$i) as 'answer$i',"; 
    $sql_part2 .= "case when q.ansr_question = ? then ansr_answer else null end as question$i$comma "; 

    } 


// make it 1 query 
$query = "select 
$sql_part1 
ansr_recordid, 
ansr_type 
FROM (
    SELECT 
     ansr_recordid, 
     ansr_type, 
     $sql_part2 
    FROM(
     select 
      ansr_recordid, 
      ansr_question, 
      ansr_answer, 
      ansr_type, 
      ansr_sortorder 
      from forms_123456 where is_answer=1 order by ansr_recordid, ansr_sortorder 
      ) q 
    )qq 
GROUP BY ansr_recordid"; 

// lets try it! 
$getAnswers = processQuery($query,$param,'fetch-raw',$server,$extra,$DBH); 
unset($param); 


// show questions and other data 
echo '<td height="19" nowrap style="background-color:#e9e9e9; font-weight:600;">Status</td> 
    <td height="19" nowrap style="background-color:#e9e9e9; font-weight:600;">Details</td>'; 

echo $question_headers; 

echo '<td height="19" nowrap style="background-color:#e9e9e9; font-weight:600;">Record ID</td> 
    <td height="19" nowrap style="background-color:#e9e9e9; font-weight:600;">Start Date</td> 
    <td height="19" nowrap style="background-color:#e9e9e9; font-weight:600;">End Date</td> 
</tr>'; 


// show values ---------------------------------------- 
$first = 1; 
while($fetch = $getAnswers->fetch()) 

{ 

// change color per row 
if($first == 0) 

    { 
    $first = 1; 
    $bgcolor = '#f1f1f1'; 
    } 
else 
    { 
    $first = 0; 
    $bgcolor = ''; 
    } 

echo '<tr>'; 

echo '<td height="19" nowrap style="background-color:'.$bgcolor.'; font-weight:400;">OK</td> 
    <td height="19" nowrap style="background-color:'.$bgcolor.'; font-weight:400;">Bekijken</td>'; 

// loop the number of questions so we get the same amount of columns 
for($i=0; $num_questions > $i; ++$i) 

    { 
    echo '<td height="19" nowrap style="background-color:'.$bgcolor.'; font-weight:400;">'.trim(ucfirst($fetch["answer$i"])).'</td>'; 
    } 

echo '<td height="19" nowrap style="background-color:'.$bgcolor.'; font-weight:400;">'.$fetch["ansr_recordid"].'</td> 
    <td height="19" nowrap style="background-color:'.$bgcolor.'; font-weight:400;">Start Date</td> 
    <td height="19" nowrap style="background-color:'.$bgcolor.'; font-weight:400;">End Date</td>'; 

echo '</tr>'; 

} 

?> 

</table> 
</div> 
Смежные вопросы