目前我有一个表 extended_values ,它以下列方式为用户存储3个自定义值。
+------+-------+---------+ | Name | Value | UserKey | +------+-------+---------+ | cs1 | tgb | 100 | | cs2 | hhy | 100 | | cs3 | ttr | 100 | | cs1 | hht | 104 | | cs2 | iyu | 104 | | cs3 | uyt | 104 | | cs1 | tjg | 106 | | cs2 | yyt | 106 | | cs3 | try | 106 | +------+-------+---------+
我有另一个表 user_custom_property ,有四列,userkey,cs1,cs2和cs3,我需要按以下格式存储值
+---------+-----+-----+-----+ | userkey | cs1 | cs2 | cs3 | +---------+-----+-----+-----+ | 100 | tgb | hhy | ttr | | 104 | hht | iyu | uyt | | 106 | tjg | yyt | try | +---------+-----+-----+-----+
有近75000个用户拥有3个自定义值,因此应优化查询,以免在内存方面消耗更多资源。
所以从技术上讲,我需要查询extended_values表,获取对应于用户密钥的cs1,cs2和cs3的值,并按以下方式将值存储在user_custom_property中。
这样做的有效方法是什么。
非常感谢
答案 0 :(得分:2)
使用GROUP BY
和CASE
可以解决问题:
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;
输出:
USERKEY CS1 CS2 CS3 ---------- -------------------- -------------------- -------------------- 100 tgb hhy ttr 104 hht iyu uyt 106 tjg yyt try
检查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;