来自MySql中表的动态标头

时间:2016-07-27 21:15:23

标签: php mysql sql dynamic

这是我的第一个问题。对不起我的英语不好以及与西班牙语混合,来自乌拉圭。

我有这个ER(例子): enter image description here 我有一个人(CI)与许多概念值有一些关系。 这些概念是Unidad,Clase,Estado等,它们有一些像“Unidad”这样的值,如2021,1061,1003。 对于每个概念,有一些领域(Fecha,Expediente,Comentario,Usuario),其中行是CI-Concepto的最大“Fecha”值。 我想列出一个人的所有关系,如下:

HEADERS

CI  |   Concepto1_clave |   Concepto1_Fecha |   Concepto1_Expediente    |   Concepto1_Comentario    |   Concepto1_Usuario   |   Concepto2_clave |   Concepto2_Fecha |   Concepto2_Expediente    |   Concepto2_Comentario    |   Concepto2_Usuario   |   ConceptoN...

VALUES

Person_CI   |   Value of concepto 1 |   Fecha of concepto 1 |   Expediente of concepto 1    |   Comentairo of concepto 1    |   Usuario of concepto 1   |   Value of concepto 2 |   Fecha of concepto 2 |   Expediente of concepto 2    |   Comentairo of concepto 2    |   Usuario of concepto 2   |   ...

所有必须是动态的,当我创建一个新概念时,它将出现在查询中。 我尝试了许多查询和程序,没有成功。 我用PHP来获得结果。 非常感谢你的帮助!!

修改

有我的表格:

Persona_ClaveConcepto

    +--------+-------------------+------------+---------+---------------+---------------+---------+
| CI     | Concepto          | Fecha      | Clave   | Expediente    | Comentario    | Usuario |
+--------+-------------------+------------+---------+---------------+---------------+---------+
| 238351 | Clase             | 1997-06-10 | X.C0.1E | FOR06/97      | CARGA SISTEMA |         |
+--------+-------------------+------------+---------+---------------+---------------+---------+
| 238351 | Situacion laboral | 1997-06-01 | 52      | FOR06/97      | CARGA SISTEMA |         |
+--------+-------------------+------------+---------+---------------+---------------+---------+
| 238351 | Unidad            | 2015-07-16 | 1532    | CARGA SISTEMA |               |         |
+--------+-------------------+------------+---------+---------------+---------------+---------+
| 612344 | Clase             | 0000-00-00 | X.C0.1E | CARGA SISTEMA |               |         |
+--------+-------------------+------------+---------+---------------+---------------+---------+
| 612344 | Situacion laboral | 1996-03-01 | 52      | HAB           | CARGA SISTEMA |         |
+--------+-------------------+------------+---------+---------------+---------------+---------+

所有“Concepto”的预期结果(类似的结果):

    +--------+---------+-------------+------------------+------------------+---------------+------------------+------------------------+-----------------------------+-----------------------------+--------------------------+
| CI     | Clase   | Fecha_Clase | Expediente_Clase | Comentario_Clase | Usuario_Clase | SituacionLaboral | Fecha_SituacionLaboral | Expediente_SituacionLaboral | Comentario_SituacionLaboral | Usuario_SituacionLaboral |
+--------+---------+-------------+------------------+------------------+---------------+------------------+------------------------+-----------------------------+-----------------------------+--------------------------+
| 238351 | X.C0.1E | 1997-06-10  | FOR06/97         | CARGA SISTEMA    |               | 52               | 1997-06-01             | FOR06/97                    | CARGA SISTEMA               |                          |
+--------+---------+-------------+------------------+------------------+---------------+------------------+------------------------+-----------------------------+-----------------------------+--------------------------+

1 个答案:

答案 0 :(得分:0)

非常感谢! 我用这个查询来解决它。希望可以帮助别人。

/* GROUP CONCAT LIMIT*/
SET SESSION group_concat_max_len = 1000000;

/* DECLARE */
SET @sqlMax = NULL;
SET @sqlCase = NULL;
SET @sql = NULL;

/* SET sqlMax (discard empty values) */
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'GROUP_CONCAT(',replace(Concepto, ' ', ''),') AS ',replace(Concepto, ' ', ''),
      ',GROUP_CONCAT(',replace(Concepto, ' ', ''),'_Fecha) AS ',replace(Concepto, ' ', ''),'_Fecha',
      ',GROUP_CONCAT(',replace(Concepto, ' ', ''),'_Expediente) AS ',replace(Concepto, ' ', ''),'_Expediente',
      ',GROUP_CONCAT(',replace(Concepto, ' ', ''),'_Comentario) AS ',replace(Concepto, ' ', ''),'_Comentario',
      ',GROUP_CONCAT(',replace(Concepto, ' ', ''),'_Usuario) AS ',replace(Concepto, ' ', ''),'_Usuario'
    )
  ) 
INTO @sqlMax
from persona_claveconceptoperseo;

/* SET sqlCase */
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'case when Concepto = ''',Concepto,''' then Clave end AS ',replace(Concepto, ' ', ''),
      ',case when Concepto = ''',Concepto,''' then Fecha end AS ',replace(Concepto, ' ', ''),'_Fecha'
      ',case when Concepto = ''',Concepto,''' then Expediente end AS ',replace(Concepto, ' ', ''),'_Expediente'
      ',case when Concepto = ''',Concepto,''' then Comentario end AS ',replace(Concepto, ' ', ''),'_Comentario'
      ',case when Concepto = ''',Concepto,''' then Usuario end AS ',replace(Concepto, ' ', ''),'_Usuario'
    )
  ) 
INTO @sqlCase
from persona_claveconceptoperseo;

/* SET sql */
SET @sql = CONCAT('SELECT CI, ', @sqlMax, ' 
                  FROM (
                    SELECT
                    CI,',@sqlCase,'
                  FROM persona_claveconceptoperseo) as t1
GROUP BY t1.CI');

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