Понадобилось для одной задачи сделать выборку из таблицы А по определенным условиям и вставить ее в таблицу B.
Можно особо не заморачиваться, сделать SELECT в переменную, потом пройтись циклом по INSERT и все.
Но это не очень красивое решение. Очень запросов много + на переменные память расходуется. Проще использовать вложенные запросы, они же nested queries. Но тут возникает проблемка — если вставлять только данные из INSERT, то все ок, но если добавлять еще и какие-нибудь неизменные значения, то выдается Subquery returned more than 1 value.
Чтобы не обьяснять на пальцах — сама таблица B
CREATE TEMPORARY TABLE `B` ( `status` TINYINT(4) NULL DEFAULT NULL , `pair` TEXT NULL DEFAULT NULL , ) ENGINE = MyISAM DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci;
Копируем из таблицы A и вставляем в B так
INSERT INTO `B` (`pair`) SELECT `pair` FROM `A` ORDER BY RAND() LIMIT 100;
Если поле status имеет неизменное значение, например 123, то просто вот так уже не вставить
INSERT INTO `B` (`status`, `pair`) VALUES ( (SELECT `pair` FROM `A` ORDER BY RAND() LIMIT 100), 123);
Не совсем красивое решение нашел
UPDATE `B` SET `status` = '123' WHERE 1=1;
Но хотелось бы в одну строку все заделать. Отпишитесь плиз в коментах, кто знает, как реализовать.
5 комментариев
А вот так разве нельзя:
INSERT INTO `B` (`pair`, ‘status’)
SELECT `pair`, 123 FROM `A` ORDER BY RAND() LIMIT 100;
Дык просто же всё
Вставлено строк: 100. ( запрос занял 0.0023 сек. )
seoshmeo , в A нет такого столбца
Dmitry, все гениальное просто )) Как я сам не додумался, ведь очевидно же. Спасибо
Спасибо, возьмем на заметку. Полезный код!
Помогите, схожая проблема, есть таблица table в ней столбы A, B со множеством строк. Так вот мне надо в этот table добавить еще строки: в столбец A рандомно из столбца B, а в столбец B тоже рандомно из столбца A.
Спасибо.