sql >> Base de Datos >  >> RDS >> Mysql

MySQL:haga un registro de una columna

Lo que estás pidiendo es básicamente un PIVOT pero MySQL no tiene una función de pivote, por lo que puede replicar esto usando un CASE declaración con una función agregada.

Si conoce los valores, puede codificar la solución de forma similar a esta:

select id,
  max(case when component_id = 1 then data end) Email,
  max(case when component_id = 2 then data end) Firstname,
  max(case when component_id = 3 then data end) Lastname,
  max(case when component_id = 4 then data end) Phone
from yourtable
group by id;

Consulte SQL Fiddle con demostración

El resultado es:

| ID |            EMAIL |  FIRSTNAME |  LASTNAME |  PHONE |
-----------------------------------------------------------
|  1 | [email protected] | firstname1 | lastname1 | phone1 |
|  2 |           email2 | firstname2 | lastname2 | phone2 |

Supongo que tiene una tabla para asociar el componente_id con un nombre, por lo que su consulta también podría ser:

select t1.id,
  max(case when t2.name = 'email' then data end) Email,
  max(case when t2.name= 'FirstName' then data end) Firstname,
  max(case when t2.name= 'LastName' then data end) Lastname,
  max(case when t2.name= 'phone' then data end) Phone
from yourtable t1
inner join component t2
  on t1.component_id = t2.id 
group by t1.id;

Consulte SQL Fiddle con demostración

Si tiene una cantidad desconocida de valores, puede usar una declaración preparada para generar esta consulta dinámicamente:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when name = ''',
      name,
      ''' then data end) AS ',
      name
    )
  ) INTO @sql
FROM component;

SET @sql = CONCAT('SELECT t1.id, ', @sql, ' 
                  from yourtable t1
                  inner join component t2
                    on t1.component_id = t2.id 
                  group by t1.id');

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

Consulte SQL Fiddle con demostración

Todas las versiones le darán el mismo resultado.