2013-11-15 6 views
2

В настоящее время у меня есть таблица 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

Какая у вас СУБД? Учитывая пользователя, которого вы хотите найти 'cs1',' cs2' и 'cs3', а затем выполните что? –

ответ

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:

Редактировать

Что касается вопроса в комментарии - вы просто должны чан e значения в 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; 
+0

Привет, Przemyslaw, у меня есть 75000 userkey и запуск этого скрипта для 75000 не является возможным вариантом. Есть ли способ, которым я могу передать всю пользовательскую кнопку в пути. Я использую способ, которым я могу хранить весь пользовательский ключ в переменной – navman

+0

@navman Это одноразовый скрипт? Вы пытались запустить этот запрос? –

+0

@navman Я только что запустил тест на столе с 75000 различными пользовательскими ключами, и потребовалось 0,1 секунды. Ты это пробовал? –

Смежные вопросы