Попытка использовать 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')
    )
";
Другие вопросы по тегам