mysql - 将多个 MySQL 记录转换为单个记录

标签 mysql sql database

我发现了与此类似的问题,但为了澄清我没有尝试使用行值作为列标题。

我有一个包含以下列的表格:
id = 自动编号
item_id = 表单提交的条目ID
field_id = 提交的表单条目中的字段 ID
meta_value = 表单字段中提交的值
创建时间 = 日期时间

我看过将字段值转换为列标题(即 field_id1、field_id2 等)的教程,但我实际上正在尝试将这些行转换为内聚的带标签记录。

列标题理想情况下应如下所示:
item_id(主键)
契约(Contract)编号(值,其中 field_id = 100 AND item_id = 第一列中的值)
供应商(值,其中 field_id = 101 AND item_id = 第一列中的值)
类型(值,其中 field_id = 102 AND item_id = 第一列中的值)
范围(值,其中 field_id = 103 AND item_id = 第一列中的值)

我知道我可以通过进行一系列小型查询来实现这一点,其中它具有 item_id 和 meta_value ,其条件设置为仅显示特定 field_id 中的记录,然后使用 item_id 将它们全部连接到主查询中这一切都在一起。但从性能的角度来看,这似乎是一种糟糕的方法。

如果有人能给我举一个例子,或者帮助我找到我应该寻找的术语,我将不胜感激!!

谢谢!

最佳答案

您想要使用条件聚合将 EAV (Entity Attribute Value) 中的记录拼凑在一起结构

SELECT item_id,
       MAX(CASE WHEN field_id = 100 THEN meta_value END) contract,
       MAX(CASE WHEN field_id = 101 THEN meta_value END) vendor,
       MAX(CASE WHEN field_id = 102 THEN meta_value END) type,
       MAX(CASE WHEN field_id = 103 THEN meta_value END) scope       
  FROM table1
 GROUP BY item_id;

这是一个dbfiddle演示

关于mysql - 将多个 MySQL 记录转换为单个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44682416/

相关文章:

sql - 有没有办法计算列中 NULL 之间的非空数量?

mysql - 重命名表中的文件名

java - postgresql hibernate 插入时出现异常

mysql - 在数据库中存储一对多列的最佳方法

r - 如何根据 R 中的索引向数据框添加列? (参见示例)

php - 在 PHP 中插入 mysql 时解析错误

mysql - 仅将一个表的一列与另一个表连接

mysql - MySql 中每秒的查询次数真的很重要吗?

php - php 死掉后 Bootstrap 下拉列表停止工作

sql - 查询未按预期工作