2012-12-15 23 views
0

我正在嘗試設置基本搜索腳本。建議將當前mysql表中的數據插入臨時表以加快搜索速度。試圖使用UNION ALL將其插入臨時表中

這是到目前爲止,我已經得到了代碼:

$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, 型號,廠名,年份,Loc.,'」在列14

我只能猜測它是與這些由之前程序員設定,而不是我可以做任何改變他們的非常規列名(LOC,銷售價格等)。

+1

您是否使用舊的'mysql_query()'API?對於較舊的驅動程序,它不支持在單個查詢調用中使用多個語句,必須先執行CREATE TABLE,然後執行INSERT –

回答

0

你有一個額外)

$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') 
    ) 
"; 
+1

不,表名是'search',表標識符在MySQL中不是單引號。 –

+0

看我的更新 –

+0

現在你錯過了表名完全。列表列表屬於'()'。 –

0

您在sql的創建部分的括號之後或者在插入之前缺少一個分號。

0

我相信你的「INSERT INTO $ temp」行不插入$ temp的內容,但實際上使用$ temp作爲表名。嘗試是這樣的:。

$ SQL = 「INSERT INTO」 $ TEMP」(....

0

當插入與臨時表 「聯盟」,你應該創建表的別名 「聯盟」

insert into temp_table (select * from (select * from table_a union select * from table_b) as table_alias)