2013-06-24 8 views
0

Я пытаюсь сделать вставку в PHP из SELECT, как показано в этом скрипте SQL HERE.php mysql insert from select fires error

Мой код:

$sql2 .= "INSERT INTO $tableBackup (Fahrer, Datum, Baustelle, Arbeitsbeginn, Arbeitsende, Projektbeginn, Projektende, Arbeitszeit, Projektzeit, Pausenzeit, Reine AZ, Sonntag, Feiertag, Urlaub, Krank, Stundensatz, Auslöse, Gesamt)"; 
     $sql2 .= "SELECT t.*,"; 
     $sql2 .= "sum(HOUR(TIMEDIFF(STR_TO_DATE(Arbeitsbeginn, '%d.%m.%Y %H:%i:%s'), STR_TO_DATE(Arbeitsende, '%d.%m.%Y %H:%i:%s')))) AS ARBEITSZEIT, sum(HOUR(TIMEDIFF(STR_TO_DATE(Projektbeginn, '%d.%m.%Y %H:%i:%s'), STR_TO_DATE(Projektende, '%d.%m.%Y %H:%i:%s')))) AS Projektzeit"; 
     $sql2 .= "FROM (SELECT DriverName AS Fahrer, Datum,Baustelle,Arbeitsbeginn,Arbeitsende,Projektbeginn,Projektende"; 
     $sql2 .= "FROM (SELECT DRIVERNAME,left(`datetime`, 10) as Datum,,GROUP_CONCAT(IF(ACTIONTEXT = 'PB', AREA, NULL)) AS 'Baustelle',GROUP_CONCAT(IF(ACTIONTEXT = 'Arbeitsbeginn', DATETIME, NULL)) AS 'Arbeitsbeginn',GROUP_CONCAT(IF(ACTIONTEXT = 'Arbeitsende', DATETIME, NULL)) AS 'Arbeitsende',GROUP_CONCAT(IF(ACTIONTEXT = 'PB', DATETIME, NULL)) AS 'Projektbeginn',GROUP_CONCAT(IF(ACTIONTEXT = 'PE', DATETIME, NULL)) AS 'Projektende'"; 
     $sql2 .= "FROM geoImportRoot GROUP BY DRIVERNAME) A CROSS JOIN (SELECT 1 AS n UNION ALL SELECT 2) n) t"; 
     $sql2 .= "GROUP BY Fahrer, Datum;"; 
     $this->DB->Execute($sql2); 

И структура новой таблицы:

`geoEdit` (
`ID` int(255) NOT NULL AUTO_INCREMENT, 
`Fahrer` text NOT NULL, 
`Datum` text NOT NULL, 
`Baustelle` text NOT NULL, 
`Arbeitsbeginn` text NOT NULL, 
`Arbeitsende` text NOT NULL, 
`Projektbeginn` text NOT NULL, 
`Projektende` text NOT NULL, 
`Arbeitszeit` text NOT NULL, 
`Projektzeit` text NOT NULL, 
`Pausenzeit` smallint(10) NOT NULL DEFAULT '1', 
`Reine AZ` int(255) DEFAULT NULL, 
`Sonntag` text, 
`Feiertag` text, 
`Urlaub` text, 
`Krank` text, 
`Stundensatz` int(10) NOT NULL DEFAULT '10', 
`Auslöse` int(255) DEFAULT NULL, 
`Gesamt` int(255) DEFAULT NULL, 
PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Это не работает. Перед запуском этого скрипта я делаю INSERT с данными в корневую таблицу geoImportRoot.

+0

Определение ** Это не работает. ** и кстати вы используете 'INSERT' но не вставляя любой' VALUES' –

+0

@ SebastianRush, вы знаете, что у вас может быть несколько строк в инструкции sql, нет необходимости конкатенировать/угадать ваш запрос. также возможно исправить '$ sql2. =" INSERT' to '$ sql2 =" INSERT' –

+0

Пожалуйста, сообщите об ошибке. Кроме того, при конкатенации строк обязательно включайте пробел, если необходимо, например, вы пропускаете пробел между projektende и FROM на следующей строке. – Eelke

ответ

2

Здесь пространство создает проблему в вашем запросе, используйте кавычка вокруг него

Pausenzeit, Reine AZ, Sonntag, 
       ^

Pausenzeit, `Reine AZ`, Sonntag, 
+1

+1 Есть ли причина для проблемы из-за пространства? Я думаю, он должен использовать двойные кавычки, поскольку обратные тики используются для имен таблиц и столбцов. –

+0

@Vivek space используется для создания псевдонима. И если кто-то создает имя_столбца с пробелом, тогда он должен использовать обратную ссылку, чтобы создать его как одноколонное имя. Мы можем использовать только backtick для table_name и column_name в 'mysql', если мы используем' double quote' или 'single quote', запрос даст ошибку. –

+0

Ohh .. yes (Pausenzeit, Reine AZ, Sonntag,) это имена столбцов, я думал, что это значения данных. :) –