【问题标题】:Is it possible to use keys as columns and values as values for a key/value database structure? [duplicate]是否可以将键用作列,将值用作键/值数据库结构的值? [复制]
【发布时间】:2020-06-22 11:54:42
【问题描述】:

我需要从 MySQL 键值表中查询一些数据,但我想得到一个“正常”表作为结果,指定键作为列。

我的表示例USERS:

ID, user_id, key,        value 
----------------------------------
1   1        first_name  Peter
2   1        last_name   Sputnick
3   2        first_name  Jan
4   2        last_name   Putgraver
5   2        country     Netherlands

我想要这个作为查询结果:

ID, first_name, last_name
----------------------------
1   Peter       Sputnick
2   Jan         Putgraaf

有没有一种好的和有效的方法来实现这一点?请注意,我不想在结果中包含国家/地区列。

我需要这个,因为我需要将此数据与另一个表中的数据连接起来,并且我不想对我需要的每个字段都使用子查询。所以我不想做这样的事情:

SELECT *,
(SELECT value 
  FROM users 
  WHERE user_id = o.user_id 
    AND key = first_name),
(SELECT value 
  FROM users 
  WHERE user_id = o.user_id 
    AND key = last_name),
FROM orders o

【问题讨论】:

  • 将值移动到列名是“透视”。显然,这将是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • @Strawberry 请接受我真诚的 Happyhammer Clappyhands ™。
  • @Strawberry 还是那个 Hammerhappy Handyclaps ™? (如果我有 Clickicon™,我就不必拼写了。)

标签: mysql join select group-by pivot


【解决方案1】:

您可以使用条件聚合:

select 
    id,
    max(case when key = 'fist_name' then value end) first_name,
    max(case when key = 'last_name' then value end) last_name
from users
group by id

【讨论】:

    【解决方案2】:

    为此,您必须使用条件聚合,

    CREATE TABLE USERS (
      `ID` VARCHAR(6),
      `user_id` VARCHAR(9),
      `key` VARCHAR(10),
      `value` VARCHAR(11)
    );
    
    INSERT INTO USERS
      (`ID`, `user_id`, `key`, `value`)
    VALUES
      ('1', '1', 'first_name', 'Peter'),
      ('2' ,  '1', 'last_name', 'Sputnick'),
      ('3', '2', 'first_name', 'Jan'),
      ('4', '2', 'last_name', 'Putgraver'),
      ('5', '2', 'country', 'Netherlands');
    
    SELECT user_id
    , MAX(IF(`key` ='first_name',`value`,NULL )) fisrt_name
    , MAX(IF(`key` ='last_name',`value`,NULL )) last_name
    FROM USERS
    GROUP BY user_id;
    
    用户 ID |第一个名字 |姓 :-------- | :--------- | :-------- 1 |彼得 |斯普特尼克 2 |一月 |普特格雷弗

    db小提琴here

    如果您想要所有密钥,您必须使用pivot table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 2016-06-19
      • 2021-08-24
      • 2021-03-26
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2016-10-11
      相关资源
      最近更新 更多