2016-08-24 3 views
1

У меня есть две таблицы, связанные идентификатором пользователя. Я хочу создать новую таблицу из обоих, которая вытягивает несколько полей из каждой таблицы. В одной таблице есть только одна строка для каждого идентификатора пользователя, а в другом - несколько строк данных для каждого пользователя.Создайте таблицу из двух таблиц, где данные находятся в строках в одной таблице

Первая таблица проста - все данные находятся в одной строке.
Однако во второй таблице данные расположены в строках, где каждый идентификатор пользователя имеет несколько строк. Я хочу найти только четыре из этих строк для каждого идентификатора пользователя, а затем вставить их в столбец в моей таблице. Это код ниже, но он не работает. Могу ли я вложить такие подзапросы?

INSERT INTO new_table 
select table1.ID, table1.user_email, table1.display_name, table2.meta-value (where table2.meta_key = ‘pet’), table2.meta-value (where table2.meta_key = ‘color'), table2.meta-value (where table2.meta_key = ‘location), table2.meta-value (where table2.meta_key = ‘house'), 
from table_1, table2 

ответ

1

Попробуйте это:

INSERT INTO new_table 
(SELECT 
    t1.ID, 
    t1.user_email, 
    t1.display_name, 
    (SELECT meta-value FROM table2 AS t2 WHERE t2.meta_key = 'pet' AND t2.user_id = t1.user_id), 
    (SELECT meta-value FROM table2 AS t2 WHERE t2.meta_key = 'color' AND t2.user_id = t1.user_id), 
    (SELECT meta-value FROM table2 AS t2 WHERE t2.meta_key = 'location' AND t2.user_id = t1.user_id), 
    (SELECT meta-value FROM table2 AS t2 WHERE t2.meta_key = 'house' AND t2.user_id = t1.user_id), 
    FROM table_1 AS t1 
) 

Однако его не тестировал, как я не найти более подробную информацию относительно схемы таблиц/данных. Надеюсь это поможет.

1

Вы можете использовать запросы для соединения:

INSERT INTO new_table 
select table1.ID, table1.user_email, table1.display_name, table3.meta-value, table4.meta-value, table5.meta-value, table6.meta-value 
from table_1 inner join 
(select ID, meta_value from table2 where meta_key='pet') as table3 inner join 
(select ID, meta_value from table2 where meta_key='color') as table4 inner join 
(select ID, meta_value from table2 where meta_key='location') as table5 inner join 
(select ID, meta_value from table2 where meta_key='house') as table6; 
1
INSERT INTO new_table 
select table1.ID, table1.user_email, table1.display_name, 
     max(if(table2.meta_key = 'pet', table2.meta-value, NULL)), 
     max(if(table2.meta_key = 'color', table2.meta-value, NULL)), 
     max(if(table2.meta_key = 'location', table2.meta-value, NULL)), 
     max(if(table2.meta_key = 'house', table2.meta-value, NULL)) 
from table1 
left join table2 on table2.user_id=table1.user_id 
group by table1.ID, table1.user_email, table1.display_name 
0

Я получил его на работу. Я не знаю, лучше ли это или хуже любого другого предложения.

INSERT INTO new_table 
SELECT t1.ID, t1.user_email, t1.display_name, 
     GROUP_CONCAT(IF(m.meta_key = 'pet_field', m.meta_value, NULL)) AS pet, 
     GROUP_CONCAT(IF(m.meta_key = 'color_field', m.meta_value, NULL)) AS color, 
     GROUP_CONCAT(IF(m.meta_key = 'location_field', m.meta_value, NULL)) AS location, 
     GROUP_CONCAT(IF(m.meta_key = 'house_field', m.meta_value, NULL)) AS house 
FROM wp_users t1, 
     wp_usermeta m 
WHERE u.ID = m.user_id 
GROUP BY u.ID;