usdglander
@usdglander
Yipee-ki-yay

Как использовать вложенный запрос с UNION?

Добрый день. Всегда пользовался удобной штукой вида
INSERT INTO `table` (`id`, `count`, `f`) (SELECT `id`, 0 AS `count`, 'foo' AS `f` FROM `table2`);

То есть сразу вставлял возвращаемые вложенным запросом строки.
Теперь мне понадобилось немного изменить его
INSERT INTO `table` (`id`, `count`, `f`) (SELECT `id`, 0 AS `count`, 'foo' AS `f` FROM `table2` [куча where] UNION SELECT `id`, `count` AS `count`, 'bar' AS `f` FROM `table3` LIMIT 1);

Оказалось что MySQL не поддерживает UNION во вложенных запросах. :(
Появилась идея сохранять результат (SELECT `id`, 0 AS `count`, 'foo' AS `f` FROM `table2` [куча where] UNION SELECT `id`, `count` AS `count`, 'bar' AS `f` FROM `table3` LIMIT 1); в переменную и потом как то пихать эту переменную в INSERT. Что то типа:
SET @record = (SELECT `id`, 0 AS `count`, 'foo' AS `f` FROM `table2` [куча where] UNION SELECT `id`, `count` AS `count`, 'bar' AS `f` FROM `table3` LIMIT 1);
INSERT INTO `table` (`id`, `count`, `f`) @record;

НО так не работает. Что можно сделать?
Заранее спасибо.
  • Вопрос задан
  • 1202 просмотра
Решения вопроса 1
0xD34F
@0xD34F
Попробуйте так:

INSERT INTO `table` (`id`, `count`, `f`)
SELECT * FROM (
  (SELECT `id`, 0 AS `count`, 'foo' AS `f` FROM `table2` [куча where])
  UNION
  (SELECT `id`, `count` AS `count`, 'bar' AS `f` FROM `table3` LIMIT 1)
) AS t;

UPD. Вообще, должно работать и без дополнительного SELECT'а:

INSERT INTO `table` (`id`, `count`, `f`)
(SELECT `id`, 0 AS `count`, 'foo' AS `f` FROM `table2` [куча where])
UNION
(SELECT `id`, `count` AS `count`, 'bar' AS `f` FROM `table3` LIMIT 1);

Но у меня phpmyadmin почему-то ругается на начало второй строки, типа "неожиданный символ", хотя запрос исполняется.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы