【问题标题】:Convert name value pairs stored as rows to columns将存储为行的名称值对转换为列
【发布时间】:2018-09-17 09:47:30
【问题描述】:

我有一张如下表:

ID  | FieldName     | FieldValue
--------------------------------
01  | event_name    | Event Title
01  | event_cost    | 10.00
01  | event_loc     | Leeds
02  | event_name    | Another Event
02  | event_cost    | 15.00
02  | event_loc     | London

我想查询这个并返回结果如下:

Title           | Cost  | Location
------------------------------------
Event Title     | 10.00 | Leeds
Another Event   | 15.00 | London

最好的方法是什么?我尝试过使用 SELECT 查询,但我只能返回一个字段值,而且我似乎无法加入它们。

【问题讨论】:

  • 做一个 GROUP BY,用例表达式做条件聚合。

标签: mysql sql join select


【解决方案1】:

你可以做条件聚合:

select max(case when FieldName = 'event_name' then FieldValue end) as Title,
       max(case when FieldName = 'event_cost ' then FieldValue end) as Cost,
       max(case when FieldName = 'event_loc' then FieldValue end) as Location
from table t
group by id;

【讨论】:

  • 信任GROUP BY 上的 MySQL 自动排序自 MySQL 5.7 版以来已被弃用 .. MySQL 8.0+ 需要 ORDER BY 才能对 GROUP BY 进行排序
  • 我已经尝试过这个查询,它以我需要的形式返回结果,但它只返回第一个结果 - 我将如何更改它以返回所有结果?
【解决方案2】:

用例当

select id, max( case when FieldName='event_name' then FieldValue end) as Title,
max(case when FieldName='event_cost' then FieldValue end) as cost,
max(case when FieldName='event_loc' then FieldValue end) as Location from t
group by id

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=940326493ef7b561375953f85f65a4ea

id  Title   cost    Location
1   Event Title     10.0    Leeds
2   Another Event   15.0    London

【讨论】:

  • 信任GROUP BY 上的 MySQL 自动排序自 MySQL 5.7 版以来已被弃用 .. MySQL 8.0+ 需要 ORDER BY 才能对 GROUP BY 进行排序
  • 我试过这个查询,它以我需要的形式返回结果,但它只返回最后一个结果 - 有没有办法全部返回?
  • @PaulJames 它会全部返回
  • @ZaynulAbadinTuhin 它只为我返回一个结果
  • @PaulJames dbfiddle.uk/… 检查链接它会全部恢复
【解决方案3】:

试试这个查询:

SELECT event_name AS 'Title', event_cost AS 'Cost', event_loc AS 'Location' 
FROM yourTableName

【讨论】:

    【解决方案4】:

    使用条件聚合。如果特定字段名称有多个匹配项,GROUP_CONCAT 可用于返回逗号分隔的列表。

    SELECT
        ID,
        GROUP_CONCAT(CASE WHEN FieldName = 'event_name' THEN FieldValue END) AS Title,
        GROUP_CONCAT(CASE WHEN FieldName = 'event_cost' THEN FieldValue END) AS Cost,
        GROUP_CONCAT(CASE WHEN FieldName = 'event_loc'  THEN FieldValue END) AS Location
    FROM yourdata
    GROUP BY ID
    

    【讨论】:

    • 自 MySQL 5.7 版以来,MySQL 对 GROUP BY 的自动排序已被弃用 .. MySQL 8.0+ 不再对 GROUP BY 进行自动排序。 topicstarter 如果你想要一个固定的顺序,你也应该使用ORDER BY
    【解决方案5】:

    用例何时和聚合:

    select max(case when fieldname='event_name' then FieldValue) as title,
    max(case when fieldname='event_cost' then FieldValue) as cost,
    max(case when fieldname='event_loc' then FieldValue) as location,
    from tablename group by id
    

    【讨论】:

    • 信任GROUP BY 上的 MySQL 自动排序自 MySQL 5.7 版以来已被弃用 .. MySQL 8.0+ 需要 ORDER BY 才能对 GROUP BY 进行排序
    • 我试过这个查询,它以我需要的形式返回结果,但它只返回第一个结果 - 有没有办法全部返回?
    猜你喜欢
    • 2010-12-21
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2023-03-21
    相关资源
    最近更新 更多