我已经尝试过各种我能想到的方式,并且根据我的研究,在UPDATE查询中使用JOIN语句。
UPDATE
`cos`
INNER JOIN
`co_types`
ON (
`cos`.`TYPE_ID`=`co_types`.`ID`
)
SET
`cos`.`ARCHIVED` = ?
WHERE
`co_types`.`A_ID` = ?;
我正在使用PDO,以execute
作为参数调用[1, 1]
。但是,在这样做时,我收到以下错误:
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'co_types.A_ID' in 'where clause'
我已经尝试从我发现的每一个方面重新排列查询,包括:
FROM
子句上面的查询是格式化版本,但是发送的原始查询除了空格外没有什么不同:
UPDATE `cos` INNER JOIN `co_types` ON (`cos`.`TYPE_ID`=`co_types`.`ID`) SET `cos`.`ARCHIVED` = ? WHERE `co_types`.`A_ID` = ?;
采用缩小版或格式化版本,手动插入值,并在MySQL的命令行或PHPMyAdmin等客户端中运行它们是成功的。
以下是我的表格定义,为简洁起见缩短了:
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;
还有更多列和诸如此类的东西,但我不认为它们与问题相关。
以下是我最初尝试调试此问题时使用的一些网站:
然而,其中大多数都有点无关紧要。无论如何,我尝试了所有可能的变化。
如果有人能说清楚为什么这不起作用,那就太棒了!
解决方案:
不对列名进行限定解决了我的问题:
UPDATE
`cos`
INNER JOIN
`co_types`
ON (
`cos`.`TYPE_ID`=`co_types`.`ID`
)
SET
`cos`.`ARCHIVED` = ?
WHERE
A_ID = ?;
答案 0 :(得分:2)
我敢打赌你的实际代码如下:
WHERE `co_types.A_ID` = ?`
请注意,它具有围绕表名和列名的反引号,而不是分别围绕每个名称。这可以防止.
字符作为表和列之间的分隔符的特殊含义,将其视为列名中的文字字符。
应该是
WHERE `co_types`.`A_ID` = ?
问题中的问题。或者完全省略反引号,当名称不包含特殊字符时不需要它们。