php - MySQL 创建一个复杂的查询

标签 php mysql sql pivot

我有三个表,一个用户表、test_sessions 表和一个类(class)表。

我需要创建一个包含完整用户列表的报告。在类(class)表中,一些类(class)的字段“track”= 1。如果它等于 1,我需要在报告中为该类(class)添加一列。

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 复制它> 声明。如果您知道要获取其值的类(class)名称,则可以对其进行硬编码:

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

参见 SQL Fiddle with Demo

如果你有未知数量的类(class),那么你可以使用准备好的语句,类似于这样:

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;

参见 SQL Fiddle with demo

关于php - MySQL 创建一个复杂的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13362493/

相关文章:

javascript - 无法并排显示选择的字段?

php - MYSQL表变大

php - 将 php 值嵌入 html 字符串

mysql: ERROR 1217 (23000): 无法删除或更新父行:外键约束失败

MySQL 完全匹配就像 LIKE

mysql - 保存 SQL 查询的中间结果

php - 为什么这个透明的 PNG 在使用 GD 组合时会产生边框?

mysql - 匹配 MySQL 中的正则表达式以排除括号中的重复词

SQL合并具有相同ID但列值不同的两行(Oracle)

sql - 在 MySQL 查询中,为什么使用 join 而不是 where?