2

目前我有一个表extended_values以下列方式为用户存储 3 个自定义值。

+-----+--------+---------+
| 姓名 | 价值 | 用户密钥 |
+-----+--------+---------+
| cs1 | tgb | 100 |
| cs2 | 嘿嘿| 100 |
| cs3 | ttr | 100 |
| cs1 | hht | 104 |
| cs2 | 伊玉 | 104 |
| cs3 | uyt | 104 |
| cs1 | tjg | 106 |
| cs2 | yyt | 106 |
| cs3 | 试试 | 106 |
+-----+--------+---------+

我有另一个表user_custom_property有四列,userkey、c​​s1、cs2 和 cs3,我需要以以下格式存储值

+---------+---+-----+------+
| 用户密钥 | cs1 | cs2 | cs3 |
+---------+---+-----+------+
| 100 | tgb | 嘿嘿| ttr |
| 104 | hht | 伊玉 | uyt |
| 106 | tjg | yyt | 试试 |
+---------+---+-----+------+

几乎有 75000 个用户有 3 个自定义值,因此应优化查询以不消耗更多的内存资源。

所以从技术上讲,我需要查询extended_values 表,获取对应于cs1、cs2 和cs3 的值以获取userkey,并以下列方式将这些值存储在user_custom_property 中。

什么是一种有效的方法来做到这一点。

非常感谢

4

1 回答 1

2

使用GROUP BYandCASE可以解决问题:

CREATE TABLE extended_values (
  name VARCHAR(20),
  value VARCHAR(20),
  userkey INT
);

INSERT INTO extended_values VALUES ('cs1', 'tgb', 100);
INSERT INTO extended_values VALUES ('cs2', 'hhy', 100);
INSERT INTO extended_values VALUES ('cs3', 'ttr', 100);
INSERT INTO extended_values VALUES ('cs1', 'hht', 104);
INSERT INTO extended_values VALUES ('cs2', 'iyu', 104);
INSERT INTO extended_values VALUES ('cs3', 'uyt', 104);
INSERT INTO extended_values VALUES ('cs1', 'tjg', 106);
INSERT INTO extended_values VALUES ('cs2', 'yyt', 106);
INSERT INTO extended_values VALUES ('cs3', 'try', 106);

COMMIT;

CREATE TABLE user_custom_property (
  userkey INT,
  cs1 VARCHAR(20),
  cs2 VARCHAR(20),
  cs3 VARCHAR(20)
);

INSERT INTO user_custom_property
  SELECT
      userkey,
      MIN(CASE WHEN name = 'cs1' THEN value END),
      MIN(CASE WHEN name = 'cs2' THEN value END),
      MIN(CASE WHEN name = 'cs3' THEN value END)
    FROM extended_values
  GROUP BY userkey;

SELECT * FROM user_custom_property;

输出:

   用户密钥 CS1 CS2 CS3                
---------- -------------------- -------- --------------------
       100 tgb hhy ttr                  
       第104章                  
       106 tjg yyt 试试

在 SQLFiddle 检查:

编辑

关于评论中的问题 - 您只需更改以下值CASE

INSERT INTO user_custom_property
  SELECT
      userkey,
      MIN(CASE WHEN name = 'ea1' THEN value END),
      MIN(CASE WHEN name = 'ea2' THEN value END),
      MIN(CASE WHEN name = 'ea3' THEN value END)
    FROM extended_values
  GROUP BY userkey;
于 2013-11-15T10:11:00.363 回答