无法在带有 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'

我已尝试根据我发现的所有可能的方式重新排列查询,包括:

以上查询是格式化版本,但是发送的原始查询除了空格外没有什么不同:

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;

还有更多专栏等等,但我认为它们与问题无关。

以下是我最初尝试调试此问题时使用的一些网站:

然而,其中大部分都有些无关紧要。无论如何,我尝试了所有可能的变化。

如果有人能阐明为什么这不起作用,那就太好了!


解法:

取消限定列名解决了我的问题:

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` = ?

如问题所述。或者完全省略反引号,当名称不包含特殊字符时不需要反引号。