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

Тема в разделе "Базы данных", создана пользователем Q_BASIC, 21 мар 2015.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Доброе время суток :)

    К примеру, есть 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 куда
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Вместо VALUES надо подставить select нужных данных из нужной тебе таблицы + join по id на `table`

    Ты же похожую тему уже создавал - https://www.nulled.cc/threads/257836/ там похожий insert есть
     
  3. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Можно готовый запрос? Я в JOIN не очень разбираюсь
     
    Последнее редактирование: 21 мар 2015
  4. cthulchu

    cthulchu Создатель

    Заблокирован
    Регистр.:
    18 мар 2015
    Сообщения:
    20
    Симпатии:
    24
    джоин не нужен. зачем этот геморрой с тонкостями джойна, если можно сделать органично сложным селектом?
    Код:
    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 - количество таблиц.

    И никакого геморроя с джойнами. Меня до сих пор смущает, как странно себя джойны ведут с нулами. Собственно, имхо только ради ловкой обработки нулов джойны созданы и были.
     
    Q_BASIC и latteo нравится это.
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Можно, но знать надо: все id, что есть в `table1`, `table2`, `table3` уже есть в table или их надо добавить?

    Это джойн и есть, только записан по другому. Вставка будет только на полное пересечение id, если в одной из трёх нумерованых таблиц такого id нет, то и в результирующую таблицу не попадёт. Нормальный left join это дело решает.
    + ТС не дал нормальные вводные данные, не понятно что у него уже есть в table.
    Хотя для частного случае решение вполне адекватное!
     
    Последнее редактирование: 21 мар 2015
    Q_BASIC нравится это.
  6. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    Данные для примера:
    Код:
    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');
     
    Последнее редактирование: 21 мар 2015
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Код:
    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 есть во всех таблицах и нет в основной.
     
    Q_BASIC нравится это.
  8. cthulchu

    cthulchu Создатель

    Заблокирован
    Регистр.:
    18 мар 2015
    Сообщения:
    20
    Симпатии:
    24
    да, все верно, скопируются только те поля, айдишники которых встречаются во всех троих таблицах. И, да, левым джойном можно все остальные скопировать. Говорю же - обработка нулов :)

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

    Вот здесь:

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

    ЗЫ

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

    зызы

    при таких инсертах, кстати, лучше всего сначала селект выполнять, смотреть, те ли он данные селектит и селектит ли вообще чего, а только потом в инсерт его пихать.
     
    Q_BASIC нравится это.
  9. konov

    konov Писатель

    Регистр.:
    2 мар 2015
    Сообщения:
    8
    Симпатии:
    3
    Привет.
    для начала нужно, чтобы поля в таблице 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'

    я так понимаю, это задачка по формированию некого регистра?
     
Статус темы:
Закрыта.