【问题标题】:Convert multiple MySQL records to single record将多条 MySQL 记录转换为单条记录
【发布时间】:2017-06-21 17:17:31
【问题描述】:

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

我有一个包含以下列的表格:
id = autonumber
item_id = 表单提交的条目 id
field_id = 提交的表单条目中的字段 id
meta_value = 表单字段中的提交值
created_at = 日期时间

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

理想情况下,列标题应如下所示:
item_id(主键)
合同编号(value where field_id = 100 AND item_id = value from第一列)
供应商(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 将它们全部连接到主查询中这一切都在一起。但从性能的角度来看,这似乎是一种糟糕的方法。

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

谢谢!

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您想使用条件聚合来拼凑来自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 演示

    【讨论】:

    • 难以置信。非常感谢您的指导!
    【解决方案2】:

    您可以对 4 个值使用自联接

      select 
            t1.item_id
          , t1.meta_value as `Contract Number`
          , t2.meta_value as Vendor
          ,  t3.meta_value as Type
          , t4.meta_value as Scope 
      from my_table t1
      inner join my_table t2 on t1.item_id = t2.item_id and t2.fiedl_id = 101 
      inner join my_table t3 on t1.item_id = t3.item_id and t3.fiedl_id = 102 
      inner join my_table t4 on t1.item_id = t4.item_id and t3.fiedl_id = 103
      where t1.field_id = 100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2019-02-18
      • 1970-01-01
      • 2023-01-20
      相关资源
      最近更新 更多