无法在带有 PDO 的 UPDATE 查询中使用 JOIN
Unable to use JOIN in an UPDATE query with PDO
我已经尝试了所有我能想到的方法,并且根据我的研究,在 UPDATE 查询中使用 JOIN 语句。
UPDATE
`cos`
INNER JOIN
`co_types`
ON (
`cos`.`TYPE_ID`=`co_types`.`ID`
)
SET
`cos`.`ARCHIVED` = ?
WHERE
`co_types`.`A_ID` = ?;
我正在使用 PDO,以 [1, 1]
作为参数调用 execute
。但是,这样做时,出现以下错误:
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'co_types.A_ID' in 'where clause'
我已尝试根据我发现的所有可能的方式重新排列查询,包括:
- 添加
FROM
子句
- 重新排序周围的子句
- 检查我的查询(成功)
- 前往 google
的第 3rd 页
- 还有一些其他的东西我在 4 小时后不太记得了...
以上查询是格式化版本,但是发送的原始查询除了空格外没有什么不同:
UPDATE `cos` INNER JOIN `co_types` ON (`cos`.`TYPE_ID`=`co_types`.`ID`) SET `cos`.`ARCHIVED` = ? WHERE `co_types`.`A_ID` = ?;
采用缩小版或格式化版,手动插入值,然后在 MySQL 的命令行或 PHPMyAdmin 等客户端中 运行 成功。
以下是我的 table 定义,为简洁起见缩短:
CREATE TABLE `cos` (
`ID` int(11) UNSIGNED NOT NULL,
`USER_ID` int(11) UNSIGNED NOT NULL,
`TYPE_ID` int(11) UNSIGNED NOT NULL,
`ARCHIVED` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `co_types` (
`ID` int(11) UNSIGNED NOT NULL,
`A_ID` int(11) UNSIGNED NOT NULL,
`NAME` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
还有更多专栏等等,但我认为它们与问题无关。
以下是我最初尝试调试此问题时使用的一些网站:
- MYSQL Update Statement Inner Join Tables
- MySql Update A Joined Table
- http://www.mysqltutorial.org/mysql-update-join/
- https://forums.mysql.com/read.php?6,156225,156271
- https://dba.stackexchange.com/questions/21152/how-to-update-one-table-based-on-another-tables-values-on-the-fly/36664
- https://dba.stackexchange.com/questions/41261/update-table-based-on-the-same-table
- http://www.voidtricks.com/mysql-inner-join-update/
- https://www.electrictoolbox.com/article/mysql/cross-table-update/
- https://makandracards.com/makandra/32357-postgresql-vs-mysql-how-to-update-using-a-join
- https://chartio.com/resources/tutorials/how-to-update-from-select-in-sql-server/
- http://www.geeksengine.com/database/data-manipulation/cross-table-update.php
- https://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/
- http://emrpms.blogspot.com/2014/12/mysql-update-example-using-group-by-and.html
- http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/
- https://www.sqlservercentral.com/Forums/Topic307916-8-1.aspx
然而,其中大部分都有些无关紧要。无论如何,我尝试了所有可能的变化。
如果有人能阐明为什么这不起作用,那就太好了!
解法:
取消限定列名解决了我的问题:
UPDATE
`cos`
INNER JOIN
`co_types`
ON (
`cos`.`TYPE_ID`=`co_types`.`ID`
)
SET
`cos`.`ARCHIVED` = ?
WHERE
A_ID = ?;
我敢打赌您的实际代码如下所示:
WHERE `co_types.A_ID` = ?`
请注意,它在 table 和列名周围都有反引号,而不是分别在它们周围。这防止了 .
字符作为 table 和列之间的分隔符的特殊含义,将其视为列名称中的文字字符。
应该是
WHERE `co_types`.`A_ID` = ?
如问题所述。或者完全省略反引号,当名称不包含特殊字符时不需要反引号。
我已经尝试了所有我能想到的方法,并且根据我的研究,在 UPDATE 查询中使用 JOIN 语句。
UPDATE
`cos`
INNER JOIN
`co_types`
ON (
`cos`.`TYPE_ID`=`co_types`.`ID`
)
SET
`cos`.`ARCHIVED` = ?
WHERE
`co_types`.`A_ID` = ?;
我正在使用 PDO,以 [1, 1]
作为参数调用 execute
。但是,这样做时,出现以下错误:
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'co_types.A_ID' in 'where clause'
我已尝试根据我发现的所有可能的方式重新排列查询,包括:
- 添加
FROM
子句 - 重新排序周围的子句
- 检查我的查询(成功)
- 前往 google 的第 3rd 页
- 还有一些其他的东西我在 4 小时后不太记得了...
以上查询是格式化版本,但是发送的原始查询除了空格外没有什么不同:
UPDATE `cos` INNER JOIN `co_types` ON (`cos`.`TYPE_ID`=`co_types`.`ID`) SET `cos`.`ARCHIVED` = ? WHERE `co_types`.`A_ID` = ?;
采用缩小版或格式化版,手动插入值,然后在 MySQL 的命令行或 PHPMyAdmin 等客户端中 运行 成功。
以下是我的 table 定义,为简洁起见缩短:
CREATE TABLE `cos` (
`ID` int(11) UNSIGNED NOT NULL,
`USER_ID` int(11) UNSIGNED NOT NULL,
`TYPE_ID` int(11) UNSIGNED NOT NULL,
`ARCHIVED` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `co_types` (
`ID` int(11) UNSIGNED NOT NULL,
`A_ID` int(11) UNSIGNED NOT NULL,
`NAME` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
还有更多专栏等等,但我认为它们与问题无关。
以下是我最初尝试调试此问题时使用的一些网站:
- MYSQL Update Statement Inner Join Tables
- MySql Update A Joined Table
- http://www.mysqltutorial.org/mysql-update-join/
- https://forums.mysql.com/read.php?6,156225,156271
- https://dba.stackexchange.com/questions/21152/how-to-update-one-table-based-on-another-tables-values-on-the-fly/36664
- https://dba.stackexchange.com/questions/41261/update-table-based-on-the-same-table
- http://www.voidtricks.com/mysql-inner-join-update/
- https://www.electrictoolbox.com/article/mysql/cross-table-update/
- https://makandracards.com/makandra/32357-postgresql-vs-mysql-how-to-update-using-a-join
- https://chartio.com/resources/tutorials/how-to-update-from-select-in-sql-server/
- http://www.geeksengine.com/database/data-manipulation/cross-table-update.php
- https://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/
- http://emrpms.blogspot.com/2014/12/mysql-update-example-using-group-by-and.html
- http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/
- https://www.sqlservercentral.com/Forums/Topic307916-8-1.aspx
然而,其中大部分都有些无关紧要。无论如何,我尝试了所有可能的变化。
如果有人能阐明为什么这不起作用,那就太好了!
解法:
取消限定列名解决了我的问题:
UPDATE
`cos`
INNER JOIN
`co_types`
ON (
`cos`.`TYPE_ID`=`co_types`.`ID`
)
SET
`cos`.`ARCHIVED` = ?
WHERE
A_ID = ?;
我敢打赌您的实际代码如下所示:
WHERE `co_types.A_ID` = ?`
请注意,它在 table 和列名周围都有反引号,而不是分别在它们周围。这防止了 .
字符作为 table 和列之间的分隔符的特殊含义,将其视为列名称中的文字字符。
应该是
WHERE `co_types`.`A_ID` = ?
如问题所述。或者完全省略反引号,当名称不包含特殊字符时不需要反引号。