sql >> Databasteknik >  >> RDS >> Mysql

MySQL - Gör en post av en kolumn

Det du efterfrågar är i grunden en PIVOT men MySQL har ingen pivotfunktion så du kan replikera detta med en CASE uttalande med en aggregerad funktion.

Om du känner till värdena kan du hårdkoda lösningen liknande denna:

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-fiol med demo

Resultatet är:

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

Jag gissar att du har en tabell för att associera component_id med ett namn så din fråga kan också vara:

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-fiol med demo

Om du har ett okänt antal värden kan du använda en förberedd sats för att generera denna fråga dynamiskt:

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-fiol med demo

Alla versioner ger dig samma resultat.




  1. Använd binär COPY-tabell FROM med psycopg2

  2. Bästa sättet att samla in och sedan importera data till drupal?

  3. Ta bort en databaspostprofil (SSMS)

  4. I Postgresql, tvinga unik på kombination av två kolumner