Копировать из нескольких таблиц в одну

Статус
В этой теме нельзя размещать новые ответы.

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Доброе время суток :)

К примеру, есть 3 таблицы: `table1`, `table2`, `table3`
У всех есть поля `id` и `text`

И есть таблица `table` с полями `table1`, `table2`, `table3`

Надо взять данные из таблиц table1, table2, table3 с данным ID и засунуть в соответствующие поля в `table`

Должно быть как-то так:
Код:
INSERT INTO `table` (table1, table2, table3) VALUES(`table1`.`text`, `table2`.`text`,`table3`.`text`)

Только WHERE куда
 
Вместо VALUES надо подставить select нужных данных из нужной тебе таблицы + join по id на `table`

Ты же похожую тему уже создавал - Для просмотра ссылки Войди или Зарегистрируйся там похожий insert есть
 
Вместо VALUES надо подставить select нужных данных из нужной тебе таблицы + join по id на `table`

Ты же похожую тему уже создавал - Для просмотра ссылки Войди или Зарегистрируйся там похожий insert есть
Можно готовый запрос? Я в JOIN не очень разбираюсь
 
Последнее редактирование:
  • Заблокирован
  • #4
джоин не нужен. зачем этот геморрой с тонкостями джойна, если можно сделать органично сложным селектом?
Код:
insert into db.destination_table
(ID, text, field2, field3, field4, field5, Date) values
((select a.id, a.text, b.field2, b.field3, c.field4, c.field5
from table1 as a, table2 as b, table3 as c
where a.id = b.id AND b.id = c.id), NOW());
Количество проверок для синхронизации таблиц всегда должно быть N-1, где N - количество таблиц.

И никакого геморроя с джойнами. Меня до сих пор смущает, как странно себя джойны ведут с нулами. Собственно, имхо только ради ловкой обработки нулов джойны созданы и были.
 
Можно затовый запрос? Я в JOIN не очень разбираюсь
Можно, но знать надо: все id, что есть в `table1`, `table2`, `table3` уже есть в table или их надо добавить?

джоин не нужен. зачем этот геморрой с тонкостями джойна, если можно сделать органично сложным селектом?
Код:
from table1 as a, table2 as b, table3 as c
where a.id = b.id AND b.id = c.id
Это джойн и есть, только записан по другому. Вставка будет только на полное пересечение id, если в одной из трёх нумерованых таблиц такого id нет, то и в результирующую таблицу не попадёт. Нормальный left join это дело решает.
+ ТС не дал нормальные вводные данные, не понятно что у него уже есть в table.
Хотя для частного случае решение вполне адекватное!
 
Последнее редактирование:
Данные для примера:
Код:
CREATE TABLE `table1` (
    `id` INT(10) AUTO_INCREMENT,
    `text` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
);
CREATE TABLE `table2` (
    `id` INT(10) AUTO_INCREMENT,
    `text` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
);
CREATE TABLE `table3` (
    `id` INT(10) AUTO_INCREMENT,
    `text` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE `table` (
    `id` INT(10) AUTO_INCREMENT,
    `table1` VARCHAR(255) NOT NULL,
    `table2` VARCHAR(255) NOT NULL,
    `table3` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
)

INSERT INTO `table1` (`text`) VALUES('Im from table1! TEXT 1');
INSERT INTO `table2` (`text`) VALUES('Im from table2! TEXT 1');
INSERT INTO `table3` (`text`) VALUES('Im from table3! TEXT 1');

INSERT INTO `table1` (`text`) VALUES('Im from table1! TEXT 2');
INSERT INTO `table2` (`text`) VALUES('Im from table2! TEXT 2');
INSERT INTO `table3` (`text`) VALUES('Im from table3! TEXT 2');

INSERT INTO `table1` (`text`) VALUES('I m from table3! TEXT 3');
INSERT INTO `table2` (`text`) VALUES('Im from table3! TEXT 3');
INSERT INTO `table3` (`text`) VALUES('Im from table3! TEXT 3');
И запрос который у меня получился:
Код:
INSERT INTO `table`(`table1`, `table2`, `table3`) VALUES(
    SELECT `table1`.`text`, `table2`.`text`, `table3`.`text`
    FROM `table1`, `table2`, `table3`
    WHERE `table1`.`id`=2 AND `table2`.`id`=2 AND `table3`.`id`=2
)

Не работает

Должно получиться тоже самое, что и этот запрос даст:
Код:
INSERT INTO `table`(`table1`, `table2`, `table3`)
VALUES('Im from table1! TEXT 2', 'Im from table2! TEXT 2', 'Im from table3! TEXT 2');
 
Последнее редактирование:
Код:
INSERT INTO `table`(`table1`, `table2`, `table3`) 
 SELECT `table1`.`text`, `table2`.`text`, `table3`.`text`
    FROM `table1`, `table2`, `table3`
    WHERE `table1`.`id`= `table2`.`id` AND `table2`.`id`= `table3`.`id`

Вот так надо, но работать будет только если id есть во всех таблицах и нет в основной.
 
  • Заблокирован
  • #8
да, все верно, скопируются только те поля, айдишники которых встречаются во всех троих таблицах. И, да, левым джойном можно все остальные скопировать. Говорю же - обработка нулов :)

Э-э-э-э, ребят, вы чего. вы инсерт делаете не в тейблы тейбла, а в поля тейбла.

Вот здесь:

Код:
INSERT INTO `table`(`table1`, `table2`, `table3`)
в скобках поля должны идти, а не таблицы.

ЗЫ

и когда у вас что-то не работает, копируйте текст ошибки. так ее быстрей находить, чем по кофейной гуще. кофе заваривать не надо.

зызы

при таких инсертах, кстати, лучше всего сначала селект выполнять, смотреть, те ли он данные селектит и селектит ли вообще чего, а только потом в инсерт его пихать.
 
Доброе время суток :)

К примеру, есть 3 таблицы: `table1`, `table2`, `table3`
У всех есть поля `id` и `text`

И есть таблица `table` с полями `table1`, `table2`, `table3`

Надо взять данные из таблиц table1, table2, table3 с данным ID и засунуть в соответствующие поля в `table`

Должно быть как-то так:
Код:
INSERT INTO `table` (table1, table2, table3) VALUES(`table1`.`text`, `table2`.`text`,`table3`.`text`)

Только WHERE куда
Привет.
для начала нужно, чтобы поля в таблице table, table1, table2, table3, были IS NULL, так как при вставке из таблицы один, поля table2 и table3 заполнены не будут и будут NULL в таблице table.
после этого просто три insert вот так:

insert into 'table' (ID, table1) select ID, text from 'table1'
insert into 'table' (ID, table2) select ID, text from 'table2'
insert into 'table' (ID, table3) select ID, text from 'table3'

вот только путанница может быть, если будешь вставлять из раных таблиц значения с одинаковым ID, поэтому может быть еще добавить поле table_id??? и тогда уже точно можно понять из какой таблицы вставлена запись.

insert into 'table' (ID, table_id, table1) select ID, 1, text from 'table1'
insert into 'table' (ID, table_id, table2) select ID, 2, text from 'table2'
insert into 'table' (ID, table_id, table3) select ID, 3, text from 'table3'

я так понимаю, это задачка по формированию некого регистра?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху