mysql - 按特定顺序选择动态行值作为列名

标签 mysql sql

继续我的 previous question :我必须使用动态行值作为列,但列的顺序需要特定。如果您查看以下示例,我必须按 start_time 升序对所选列进行排序。

例如:

+---------+------------+-------------------+----------+---------------+---------------+
| exec_id | project_id | flow_id           | job_id   | start_time    | end_time      |
+---------+------------+-------------------+----------+---------------+---------------+
|   10919 |         16 | my_flow_cleanup   | init     | 10            | 15            |
|   10919 |         16 | my_flow_cleanup   | job_id_1 | 30            | 40            |
|   10919 |         16 | my_flow_cleanup   | job_id_2 | 40            | 50            |
|   10919 |         16 | my_flow_cleanup   | job_id_3 | 20            | 25            |
+---------+------------+-------------------+----------+---------------+---------------+

来自上一个问题:

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
  CONCAT('MAX(CASE WHEN job_id = ''',
         job_id, 
         ''' THEN start_time END) `',
         job_id,
         '_start`',
         ',',
         'MAX(CASE WHEN job_id = ''',
         job_id,
         ''' THEN end_time END) `',
         job_id,
         '_end`' 
         )

 )
  INTO @sql
  FROM t;

SET @sql = CONCAT('SELECT exec_id, ', @sql, ' 
                     FROM t 
                    GROUP BY exec_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

以上查询将返回以下结果:

exec_id     init_start            init_end            job_id_1_start       job_id_1_end       job_id_2_start        job_id_2_end        job_id_3_start      job_id_3_end
10919       10                    15                  30                   40                 40                    50                  20                  25

但我需要:

exec_id     init_start            init_end            job_id_3_start       job_id_3_end       job_id_1_start        job_id_1_end        job_id_2_start      job_id_2_end
10919       10                    15                  20                   25                 30                    40                  40                  50

请注意,列的顺序现在已根据 start_time 更改。

我试着用临时表 View 来做这件事,我认为这会很容易。不幸的是,我没有创建表/创建 View 的权限。有没有办法在没有临时表和 View 的情况下实现这一目标?

最佳答案

您可以通过在 GROUP_CONCAT 函数中添加 ORDER BY start_time ASC 来实现此目的

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
  CONCAT('MAX(CASE WHEN job_id = ''',
         job_id, 
         ''' THEN start_time END) `',
         job_id,
         '_start`',
         ',',
         'MAX(CASE WHEN job_id = ''',
         job_id,
         ''' THEN end_time END) `',
         job_id,
         '_end`' 
         )
          ORDER BY start_time ASC        
 )
  INTO @sql
  FROM t;

SET @sql = CONCAT('SELECT exec_id, ', @sql, ' 
                     FROM t 
                    GROUP BY exec_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Fiddle Demo

关于mysql - 按特定顺序选择动态行值作为列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690485/

相关文章:

php - 有没有办法在 PHP 中按表名分隔 MySQL 查询结果?

java - Mysql查询插入时截断数据

mysql - 如何获取最小函数结果的列名?

mysql - Laravel SQL 未按预期执行。没有语法错误

mysql - 我怎样才能使这个 MySQL 查询(带有子查询)更快?

php - 使用codeigniter在MySQL中通过foreach保存多个复选框数据

每次服务器重新启动后 MySQL 都会损坏

mysql - 自动字段重置MYSQL

sql - 触发器-postgres

mysql - 左连接上的 Concat 正则表达式