Попытка использовать UNION ALL для вставки во временную таблицу
Я пытаюсь настроить основной сценарий поиска. Для ускорения поиска было предложено вставить данные из текущих таблиц mysql во временную таблицу.
Вот код, который я получил до сих пор:
$temp = 'search_' . date('YmdHis'); // name your temp table
$sql = "CREATE TEMPORARY TABLE IF NOT EXISTS {$temp} (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`Model` varchar(255) default NULL,
`Make` varchar(255) default NULL,
`Year` varchar(255) default NULL,
`Loc.` varchar(255) default NULL,
`Sale Price` varchar(255) default NULL,
`Serial No.` varchar(255) default NULL,
`Stock No.` varchar(255) default NULL,
`Tag No.` varchar(255) default NULL,
`Comments` varchar(255) default NULL,
`Description` varchar(255) default NULL,
FULLTEXT KEY `Model` (`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description`)
)";
$sql .= "INSERT INTO $temp (
id,
Model,
Make,
Year,
`Loc.`,
`Sale Price`,
`Serial No.`,
`Tag No.`,
Comments,
Description
)
(
(SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_auger_and_grain_handling WHERE Status='IN' or Status='OF'
UNION ALL
SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_combine WHERE Status='IN' or Status='OF'
UNION
SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_tractor WHERE Status='IN' or Status='OF')
)
)";
?>
Вот ошибка, которую я получаю:
Не удалось выполнить запрос, потому что: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который следует использовать рядом с INSERT INTO search_20121215094411 (id, Model, Make, Year,
Loc.
, `'в строке 14
Я могу только догадываться, что это как-то связано с нетрадиционными именами столбцов (Loc., Sale Price и т. Д.). Они были установлены предыдущим программистом, и я не могу внести в них какие-либо изменения.
4 ответа
Я считаю, что ваша строка "INSERT INTO $temp" не вставляет содержимое $ temp, а фактически использует $ temp в качестве имени таблицы. Попробуйте что-то вроде этого:
$ sql = "INSERT INTO". $ temp. "(....
При вставке во временную таблицу с помощью "union", вы должны создать псевдоним для таблицы "union"
insert into temp_table (select * from (select * from table_a union select * from table_b) as table_alias)
Вы пропускаете точку с запятой после круглой скобки в части создания sql или перед вставкой.
У вас есть дополнительный )
$sql .= "INSERT INTO $temp (
id,
Model,
Make,
Year,
`Loc.`,
`Sale Price`,
`Serial No.`,
`Tag No.`,
Comments,
Description
)
(
(SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_auger_and_grain_handling WHERE Status='IN' or Status='OF'
UNION ALL
SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_combine WHERE Status='IN' or Status='OF'
UNION
SELECT null,`Model`,`Make`,`Year`,`Loc.`,`Sale Price`,`Serial No.`,`Stock No.`,`Tag No.`,`Comments`,`Description` FROM ag_tractor WHERE Status='IN' or Status='OF')
)
";