[英]MySQL creating a complex query
我有三个表,一个用户表,test_sessions 表和一个课程表。
我需要创建一个包含完整用户列表的报告。 在课程表中,有些课程有一个字段'track' = 1。如果它等于1,我需要在报告中为该课程添加一列。
test_sessions 表有一个 complete_date 字段以及 user_id 和 course_id。
对于报告,我需要这样的东西:
______|Tracked Course 1|Tracked Course 2 |Tracked Course 3
User 1|complete date |complete date |complete date
User 2|complete date |complete date |complete date
User 3|complete date |complete date |complete date
我希望能够编写一个查询来执行此操作,这可能吗?
这基本上是一个PIVOT
,但 MySQL 没有PIVOT
因此您需要使用聚合和CASE
语句复制它。 如果您知道想要获取值的课程名称,则可以对其进行硬编码:
select u.userName,
max(case when c.coursename = 'Course 1' then s.completed_date end) Course1,
max(case when c.coursename = 'Course 2' then s.completed_date end) Course2,
max(case when c.coursename = 'Course 3' then s.completed_date end) Course3
from users u
left join test_sessions s
on u.user_id = s.user_id
left join courses c
on s.course_id = c.course_id
group by u.username
如果您的课程数量未知,那么您可以使用准备好的语句,类似于:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when c.coursename = ''',
coursename,
''' then s.completed_date end) AS ',
coursename
)
) INTO @sql
FROM courses;
SET @sql = CONCAT('SELECT u.userName, ', @sql, '
from users u
left join test_sessions s
on u.user_id = s.user_id
left join courses c
on s.course_id = c.course_id
group by u.username');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.