为具有相同ID的多行选择不同的值

Jus*_*ays 5 mysql sql

我有一个看起来像这样的表:

ID | FIELD_NAME   | VALUE
23 |  sign_up     |  yes
23 |  first_name  |  Fred
23 |  street      |  Barber Lane
24 |  sign_up     |  no
24 |  first_name  |  Steve
24 |  street      |  Camaro St.
25 |  sign_up     |  yes
25 |  first_name  |  Larry
25 |  street      |  Huckleberry Ave
Run Code Online (Sandbox Code Playgroud)

我想运行一个查询,它将选择唯一的ID和值作为命名列,所以它看起来像这样:

ID   |   SIGN_UP   | FIRST_NAME  |  STREET           |
23   |     yes     |    Fred     |  Barber Lane      |
24   |     no      |    Steve    |  Camaro St.       |
25   |     yes     |    Larry    |  Huckleberry Ave. |
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!!

Zan*_*ien 5

您可以使用这个简单的解决方案

SELECT DISTINCT
    a.id,
    b.value AS SIGN_UP,
    c.value AS FIRST_NAME,
    d.value AS STREET
FROM tbl a
LEFT JOIN tbl b ON a.id = b.id AND b.field_name = 'sign_up'
LEFT JOIN tbl c ON a.id = c.id AND c.field_name = 'first_name'
LEFT JOIN tbl d ON a.id = d.id AND d.field_name = 'street'
Run Code Online (Sandbox Code Playgroud)

为了安全起见,我做了连接LEFT JOIN,因为我不知道id是否可以丢失字段,在这种情况下它们将显示NULL在我们的派生列中.


SQL-Fiddle演示


And*_*y M 5

您还可以在分组和条件聚合的帮助下尝试旋转:

SELECT
  ID,
  MAX(CASE FIELD_NAME WHEN 'sign_up'    THEN VALUE END) AS SIGN_UP,
  MAX(CASE FIELD_NAME WHEN 'first_name' THEN VALUE END) AS FIRST_NAME,
  MAX(CASE FIELD_NAME WHEN 'street'     THEN VALUE END) AS STREET
FROM atable
GROUP BY
  ID
;
Run Code Online (Sandbox Code Playgroud)