如何编写 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_name
和 email
的记录联系在一起。鉴于此,您可以按此 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
这是想要的结果:
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_name
和 email
的记录联系在一起。鉴于此,您可以按此 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