MySQL - 从一列中创建一条记录

标签 mysql sql pivot

我无法弄清楚这个。

我有这张表:

id    component_id     data
1     1                tests@dsaasd.com
1     2                firstname1
1     3                lastname1
1     4                phone1
2     1                email2
2     2                firstname2
2     3                lastname2
2     4                phone2

现在我想要一个查询,根据 id 提取所有数据。我想要这些记录:

1  tests@dsaasd.com  firstname1  lastname1  phone1
2  email2  firstname2  lastname2  phone2

希望大家能理解我的意思......

最佳答案

您所要求的基本上是一个PIVOT,但MySQL没有枢轴函数,因此您可以使用具有聚合函数的CASE语句来复制它。

如果您知道这些值,那么您可以对类似于以下内容的解决方案进行硬编码:

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;

参见SQL Fiddle with Demo

结果是:

| ID |            EMAIL |  FIRSTNAME |  LASTNAME |  PHONE |
-----------------------------------------------------------
|  1 | tests@dsaasd.com | firstname1 | lastname1 | phone1 |
|  2 |           email2 | firstname2 | lastname2 | phone2 |

我猜测您有一个表将 component_id 与名称相关联,因此您的查询也可能是:

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;

参见SQL Fiddle with Demo

如果您有未知数量的值,则可以使用准备好的语句动态生成此查询:

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;

参见SQL Fiddle with Demo

所有版本都会给您相同的结果。

关于MySQL - 从一列中创建一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726256/

相关文章:

cmd - ExtJS 6 - 没有 CMD 的枢轴

python - Pandas 使用其他列中的值创建新列,并根据列值进行选择

php - 如何在一个查询中从两个表中获取记录

SQL 查询将分组结果作为单行返回

python - 从原子数据库事务中与外部世界通信

c# - 处理数据库时的最佳实践

sql - 如何删除 MS SQL 数据库中最旧的一周(期间)?

mysql - 多个多对多关系SQL查询

MySQL 查询值不会传递到 ejs 文件。查询取决于先前查询的结果

mysql - 无法进一步优化 MySQL 查询 : what am I missing?