如何编写 MySQL 将特定行值转置为新列的查询?

How to write a MySQL query that will transpose particular row values into new columns?

这是想要的结果:

sr no. | fullname      | email  
----------------------------------------
1.     | demo user     | demo@test.com 
2.     | sagar panchal | sagar@gmail.com

我试过了:

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

这给出了如下图所示的输出:

尝试这样的事情:

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

似乎唯一的关联方式是创建日期:

Select q.answer 作为全名, (select 来自 ds_tbl_event_question 的回答,其中 field_type = 'email' 和 created_date = q.created_date)作为电子邮件 来自 ds_tbl_event_question q 其中 q.field_type = 'full_name';

似乎只有字段 created_date 将您要从中获取 full_nameemail 的记录联系在一起。鉴于此,您可以按此 created_date 分组并使用聚合函数(例如 min)仅考虑具有特定 field_type 值的那些记录的 answer 值:

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 语句根本不考虑任何其他值:

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