2015-11-27 6 views
3

Я хотел бы ОБНОВИТЬ несколько таблиц одновременно, поэтому я использовал LEFT JOIN для создания одного запроса для моего UPDATE. Я попробовал 2 подхода, чтобы сделать LEFT JOIN, но оба не удалось. Я не вижу, где я сделал ошибку, поэтому я надеюсь, что кто-то сможет правильно проанализировать запрос и указать на ошибку.Обновление с LEFT JOIN pdo php mysql

Я уже применяется форматирование к запросу, так что я бы выглядеть читаемым, чем раньше, чтобы посмотреть:

Первый является:

"UPDATE " 
. 
"table1 AS t1 SET t1.Bid = :id " 
. 
"LEFT JOIN table2 AS t2 SET t2.id = :id ON t1.Bid = t2.id AND t1.status = t2.status " 
. 
"LEFT JOIN table3 AS t3 SET t3.Bid = :id ON t1.Bid = t3.Bid AND t1.status = t3.status " 
. 
"LEFT JOIN table4 AS t4 SET t4.id = :id ON t1.Bid = t4.id AND t1.status = t4.status " 
. 
"LEFT JOIN table5 AS t5 SET t5.Bid = :id ON t1.Bid = t5.Bid AND t1.status = t5.status " 
. 
"LEFT JOIN table6 AS t6 SET t6.id = :id ON t1.Bid = t6.id AND t1.status = t6.status " 
. 
"LEFT JOIN table7 AS t7 SET t7.Bid = :id ON t1.Bid = t7.Bid AND t1.status = t7.status " 
. 
"LEFT JOIN table8 AS t8 SET t8.id = :id ON t1.Bid = t8.id AND t1.status = t8.status " 

. 
"WHERE t1.Bid = :oldid AND t1.status = :status " 

Второй один является:

$stmt = $dbh - > prepare("UPDATE " 
    . 
    "table1 AS t1 " 
    . 
    "LEFT JOIN table2 AS t2 ON t1.Bid = t2.id AND t1.status = t2.status " 
    . 
    "LEFT JOIN table3 AS t3 ON t1.Bid = t3.Bid AND t1.status = t3.status " 
    . 
    "LEFT JOIN table4 AS t4 ON t1.Bid = t4.id AND t1.status = t4.status " 
    . 
    "LEFT JOIN table5 AS t5 ON t1.Bid = t5.Bid AND t1.status = t5.status " 
    . 
    "LEFT JOIN table6 AS t6 ON t1.Bid = t6.id AND t1.status = t6.status " 
    . 
    "LEFT JOIN table7 AS t7 ON t1.Bid = t7.Bid AND t1.status = t7.status " 
    . 
    "LEFT JOIN table8 AS t8 ON t1.Bid = t8.id AND t1.status = t8.status " 
    . 
    " SET t1.Bid = :id, " 
    . 
    " SET t2.id = :id, " 
    . 
    " SET t3.Bid = :id, " 
    . 
    " SET t4.id = :id, " 
    . 
    " SET t5.Bid = :id, " 
    . 
    " SET t6.id = :id, " 
    . 
    " SET t7.Bid = :id, " 
    . 
    " SET t8.id = :id " 

    . 
    "WHERE t1.Bid = :oldid AND t1.status = :status "); 

ОБНОВЛЕНИЕ

Я использую первый вариант и я получаю:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN table2 AS t2 SET t2.id = '315-512-613-12' at line 1'

Второй один получает:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET t2.id = '315-512-613-123V', SET t3.Bid = '315-512-613-123V', SE' at line 1'

+1

Так в чем проблема? Укажите ожидаемый и фактический результат обоих запросов. Я считаю, что синтаксис Mysql для ** update ** несколько таблиц: 'UPDATE t1, t2, t3 SET t1.field1 = value1, t2.field2 = value2 ... WHERE t1.pk = t2.fk ...' –

+0

Check ошибка, возвращаемая MySQL при выполнении запроса. – Jocelyn

+0

@AlexBlex Я ожидаю, что он обновится, но я получу ошибку. Я проверю ошибку и вставлю ее при обновлении. Мне не нужно использовать левое соединение, это то, что вы имеете в виду, но что, если конкретный идентификатор не существует в таблица, которая означала бы, что она не будет обновлена. Это одна из причин, по которой я использовал 'LEFT JOIN' – guradio

ответ

1

I had it working using this query.

"UPDATE 
    table1 AS t1 LEFT JOIN 
    table2 AS t2 ON t1.Bid = t2.id AND t1.status = t2.status LEFT JOIN 
    table3 AS t3 ON t1.Bid = t3.Bid AND t1.status = t3.status LEFT JOIN 
    table4 AS t4 ON t1.Bid = t4.id AND t1.status = t4.status LEFT JOIN 
    table5 AS t5 ON t1.Bid = t5.Bid AND t1.status = t5.status LEFT JOIN 
    table6 AS t6 ON t1.Bid = t6.id AND t1.status = t6.status LEFT JOIN 
    table7 AS t7 ON t1.Bid = t7.Bid AND t1.status = t7.status LEFT JOIN 
    table7 AS t8 ON t1.Bid = t8.id AND t1.status = t8.status 
    SET t1.Bid = :id, 
     t2.id = :id, 
     t3.Bid = :id, 
     t4.id = :id, 
     t5.Bid = :id, 
     t6.id = :id, 
     t7.Bid = :id, 
     t8.id = :id 
    WHERE t1.Bid = :oldid 
    AND t1.status = :status "