【发布时间】:2015-11-27 11:42:35
【问题描述】:
我想同时更新多个表,所以我使用 LEFT JOIN 为我的 UPDATE 创建一个查询。我尝试了 2 种方法来进行 LEFT JOIN,但都失败了。我看不出我在哪里犯了错误,所以我希望有人能够正确剖析查询并指出错误。
我已经对查询应用了一些格式,以便我看起来比以前更易读:
首先是:
"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 ");
更新
我使用第一个选项,我得到:
致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的 'LEFT JOIN table2 AS t2 SET t2.id = '315-512-613-12' 附近使用的正确语法
第二个得到:
致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'SET t2.id = '315-512-613-123V', SET t3.Bid = '315-512-613-123V', SE' 附近使用正确的语法在第 1 行'
【问题讨论】:
-
那么问题出在哪里?请包括两个请求的预期和实际结果。我相信 update 多个表的 Mysql 语法是
UPDATE t1, t2, t3 SET t1.field1=value1, t2.field2=value2 ... WHERE t1.pk=t2.fk ... -
在执行查询时检查 MySQL 返回的错误。
-
@AlexBlex 我希望它会更新,但我收到错误。我会检查错误并将其粘贴到更新中。我不需要使用左连接是你的意思吗?但如果表中不存在特定 ID,这意味着它不会被更新。这就是我使用
LEFT JOIN的原因之一