【问题标题】:Unable to use JOIN in an UPDATE query with PDO无法在带有 PDO 的 UPDATE 查询中使用 JOIN
【发布时间】:2018-07-20 20:27:26
【问题描述】:

我已经尝试了所有我能想到的方法,并且根据我的研究,在 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 子句
  • 重新排列子句
  • 检查我的查询(成功)
  • 进入谷歌第三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 = ?;

【问题讨论】:

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


    【解决方案1】:

    我敢打赌,您的实际代码如下所示:

    WHERE `co_types.A_ID` = ?`
    

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

    应该是

    WHERE `co_types`.`A_ID` = ?
    

    就像问题一样。或者完全省略反引号,当名称不包含特殊字符时不需要它们。

    【讨论】:

    • 我分享的代码 (UPDATE `cos` INNER JOIN `co_types` ON (`cos`.`TYPE_ID`=`co_types`.`ID`) SET `cos`.`ARCHIVED` = ? WHERE `co_types`.`A_ID` = ?;) 正是我运行的。
    • 如果改成WHERE A_ID = ?会怎样?
    • 我收到了相同的 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'co_types.A_ID' in 'where clause',这似乎很奇怪,因为我什至没有完全限定列名。
    • 是的,这很奇怪。它怎么知道它不应该抱怨cos.A_ID?你能在 mysqld 中打开查询日志并查看它记录的内容吗?见stackoverflow.com/questions/6479107/…
    • 有没有意见?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2011-05-19
    • 2013-04-10
    • 1970-01-01
    • 2014-05-26
    • 2019-08-09
    • 2013-09-19
    相关资源
    最近更新 更多