2017-02-18 3 views
-1

Вот желаемый результат:Как написать запрос MySQL, который будет переносить определенные значения строк в новые столбцы?

sr no. | fullname  | email 
---------------------------------------- 
1.  | demo user  | [email protected] 
2.  | sagar panchal | [email protected] 

Я пробовал:

SELECT * 
FROM `ds_tbl_event_question` q 
LEFT JOIN `ds_tbl_event_participant` p ON q.event_id = p.event_id 
AND p.question_id = q.event_question_id 
LEFT JOIN `ds_events` e ON e.event_id = q.event_id 
WHERE (
q.field_type = 'email' 
OR q.field_type = 'full_name' 
) 
AND e.store_code = 'H9OCEN' 
LIMIT 0 , 30 

Это дало выход, как показано на следующем рисунке:

enter image description here

+0

Там нет ничего, что бы связать ответы вместе, так что это не возможно, чтобы достичь того, чего вы хотите. Вам нужно было бы хранить ответы на вопросы, тогда это было бы возможно. – Shadow

+0

@Shadow, все поля не фиксированы, его динамическое генерирование – SagarPPanchal

+0

Не знаю, что вы подразумеваете под своим комментарием и как это актуально – Shadow

ответ

2

Кажется, что только поле created_date связывает записи, из которых вы хотите взять full_name и email. Учитывая, что вы могли бы группировать по этой created_date и использовать агрегатную функцию (например, min) с учетом только answer -значения этих записей с определенным field_type -Value:

select 
    min(CASE field_type WHEN 'full_name' THEN answer ELSE NULL END) as 'fullname', 
    min(CASE field_type WHEN 'email' THEN answer ELSE NULL END) as 'email' 
FROM `ds_tbl_event_question` q 
    LEFT JOIN `ds_tbl_event_participant` p ON q.event_id = p.event_id AND p.question_id = q.event_question_id 
    LEFT JOIN `ds_events` e ON e.event_id = q.event_id 
WHERE (
     q.field_type = 'email' 
    OR q.field_type = 'full_name' 
    ) 
    AND e.store_code = 'H9OCEN' 
group by created_date 

Обратите внимание, что совокупная функция (здесь: min) необходимо, поскольку предложение select не должно содержать других атрибутов, кроме тех, которые перечислены в предложении group by, кроме случаев, когда они используются в агрегатной функции.

В предыдущем запросе я попытался как можно меньше адаптировать ваш запрос. На самом деле запрос можно было бы укоротить: левые соединения фактически превращаются в соединение, поскольку вы используете WHERE - условие с левой стороны; и условие на field_type является излишним, поскольку case -statements не рассматривать любые другие значения вообще:

select 
    min(CASE field_type WHEN 'full_name' THEN answer ELSE NULL END) as 'fullname', 
    min(CASE field_type WHEN 'email' THEN answer ELSE NULL END) as 'email' 
FROM `ds_tbl_event_question` q 
    JOIN `ds_tbl_event_participant` p ON q.event_id = p.event_id AND p.question_id = q.event_question_id 
    JOIN `ds_events` e ON e.event_id = q.event_id AND e.store_code = 'H9OCEN' 
group by created_date 
+0

спасибо большое! благодарный ответ !!! gud job !!! – SagarPPanchal

1

Попробуйте что-то вроде этого:

SELECT full_names.answer AS full_name, 
     emails.answer AS email FROM 
(SELECT created_date 
FROM ds_tbl_event_question 
GROUP BY created_date) created_dates 
JOIN 
(SELECT created_date, answer 
FROM ds_tbl_event_question 
WHERE field_type = 'full_name') full_names 
ON full_names.created_date = created_dates.created_date 
JOIN 
(SELECT created_date, answer 
FROM ds_tbl_event_question 
WHERE field_type = 'email') emails 
ON emails.created_date = created_dates.created_date 

См Rextester демо: http://rextester.com/OBQ69221

+1

awesome !!! приятное объяснение с демо! gud job !!! – SagarPPanchal

1

Похоже, единственный способ, чтобы связать это с датой формирования:

Выбрать q.answer как FULLNAME, (выбрать ответ из ds_tbl_event_question где field_type = 'электронная почта' и created_date = q.created_date) по электронной почте из ds_tbl_event_question q, где q.field_type = 'full_name';

Смежные вопросы