sql >> Database teknologi >  >> RDS >> Mysql

MySQL - Lav én post ud af en kolonne

Det du beder om er dybest set en PIVOT men MySQL har ikke en pivotfunktion, så du kan replikere dette ved hjælp af en CASE sætning med en aggregeret funktion.

Hvis du kender værdierne, så kan du hårdkode løsningen svarende til denne:

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;
 

Se SQL Fiddle with Demo

Resultatet er:

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

Jeg gætter på, at du har en tabel til at knytte component_id til et navn, så din forespørgsel kan også være:

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;
 

Se SQL Fiddle with Demo

Hvis du har et ukendt antal værdier, kan du bruge en forberedt sætning til at generere denne forespørgsel dynamisk:

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;
 

Se SQL Fiddle with Demo

Alle versioner vil give dig det samme resultat.




  1. Kunne ikke indlæse driverklassen com.mysql.jdbc.Driver

  2. Laravel-forespørgsel for at få resultater med mindst ét ​​element i en matrix?

  3. MySQL Vælg en anden række, hvis der ikke findes en

  4. Opdater værdier fra MYSQL-tabellen uden at genindlæse siden?