将垂直表转换为水平表

pxy2qtax  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(394)

我正在寻找一个干净,快速和良好的解决方案为这个行动。首先我有一张这样的table

  1. field_id - item_id - value
  2. 1 - 781 - name1
  3. 2 - 781 - lastname1
  4. 3 - 781 - phone1
  5. 1 - 782 - name2
  6. 2 - 782 - lastname2
  7. 3 - 782 - phone2
  8. 1 - 783 - name3
  9. 2 - 783 - lastname3
  10. 3 - 783 - phone3

我想这样显示这个表:

  1. item_id - name - lastname - phone
  2. 781 - name1 - lastname1 - phone1
  3. 782 - name2 - lastname2 - phone2
  4. 783 - name3 - lastname3 - phone3

我试过了

  1. SELECT field_id, item_id,
  2. (CASE WHEN field_id = 1 THEN value END) AS name,
  3. (CASE WHEN field_id = 2 THEN value END) AS lastname,
  4. (CASE WHEN field_id = 3 THEN value END) AS phone
  5. FROM cq6xb_fields_values
  6. GROUP BY item_id;

但我得到了一个奇怪的结果

  1. item_id - name - lastname - null
  2. 781 - null - lastname1 - null
  3. 782 - null - lastname2 - null
  4. 783 - null - lastname3 - null
up9lanfz

up9lanfz1#

注意:请看我在您的问题下的评论,表结构本来就不好,这就是为什么它变得如此复杂的原因。
如果您真的想这样做,您需要连接到限制为所属字段\ id值的表,或者使用子查询。
所以这可以起作用:

  1. SELECT main.item_id, names.value AS name, lastnames.value AS lastname, phones.value AS phone
  2. FROM cq6xb_fields_values AS main
  3. LEFT JOIN cq6xb_fields_values AS names ON names.item_id = main.item_id AND names.field_id=1
  4. LEFT JOIN cq6xb_fields_values AS lastnames ON lastnames.item_id = main.item_id AND lastnames.field_id=2
  5. LEFT JOIN cq6xb_fields_values AS phones ON phones.item_id = main.item_id AND phones.field_id=3
  6. GROUP BY main.item_id
5us2dqdw

5us2dqdw2#

你不远,只要添加max,你可以删除字段id,因为你不使用它。

  1. SELECT item_id,
  2. max(CASE WHEN field_id = 1 THEN value END) AS name,
  3. max(CASE WHEN field_id = 2 THEN value END) AS lastname,
  4. max(CASE WHEN field_id = 3 THEN value END) AS phone
  5. FROM cq6xb_fields_values
  6. GROUP BY item_id;
  7. +---------+-------+-----------+--------+
  8. | item_id | name | lastname | phone |
  9. +---------+-------+-----------+--------+
  10. | 781 | name1 | lastname1 | phone1 |
  11. | 782 | name2 | lastname2 | phone2 |
  12. | 783 | name3 | lastname3 | phone3 |
  13. +---------+-------+-----------+--------+
  14. 3 rows in set (0.00 sec)

相关问题