无法在PDO的UPDATE查询中使用JOIN

时间:2018-02-10 01:53:39

标签: php mysql join pdo mysql-error-1064

我已经尝试过各种我能想到的方式,并且根据我的研究,在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子句
  • 重新排序
  • 周围的条款
  • Linting my query(success)
  • 转到google
  • 的3 rd 页面
  • 还有一些其他的事情,我不记得这4小时之后......

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

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

1 个答案:

答案 0 :(得分:2)

我敢打赌你的实际代码如下:

WHERE `co_types.A_ID` = ?`

请注意,它具有围绕表名和列名的反引号,而不是分别围绕每个名称。这可以防止.字符作为表和列之间的分隔符的特殊含义,将其视为列名中的文字字符。

应该是

WHERE `co_types`.`A_ID` = ?
问题中的问题。或者完全省略反引号,当名称不包含特殊字符时不需要它们。