反引号引起sql查询错误

use*_*151 5 mysql sql

SELECT `text`,
       `oc_product_to_category.product_id`
FROM `oc_product_attribute` AS pa
LEFT JOIN `oc_attribute_description` AS od ON pa.`attribute_id`=od.`attribute_id`
LEFT JOIN `oc_product_to_category` AS opc ON pa.`product_id`=od.`product_id`
Run Code Online (Sandbox Code Playgroud)

引起的问题oc_product_to_category.product_id。我删除了它并且它起作用了。据我所知,我可以像这个 opc 那样做。product_id但为什么oc_product_to_category.product_id不起作用?

cod*_*eim 3

在这种情况下,反引号不会导致您的问题。

您为表设置了别名,但随后在列列表中使用了原始名称。您需要通过其别名来引用它。

 oc_product_to_category.product_id
Run Code Online (Sandbox Code Playgroud)

应该

 opc.product_id
Run Code Online (Sandbox Code Playgroud)

我建议您删除所有反引号并只编写标准 SQL。我在查询中没有看到任何可以证明使用非标准转义序列使其混乱的合理性;其中包括 TEXT,因为 MySQL 允许您使用未转义的文本,以及其他保留字的简短列表,例如 ACTION、BIT、DATE、ENUM、NO、TIME 和 TIMESTAMP。

http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

一般来说,我避免转义标识符,并且特别避免反引号,因为它们是非标准且不可移植的。如果配置正确,MySQL 可以处理双引号的标准 SQL 引用语法。在新数据库上,我启用 ANSI_QUOTES。

SET global sql_mode='ANSI_QUOTES';
Run Code Online (Sandbox Code Playgroud)

尽管您永远不应该在生产数据库上执行此操作,因为它会改变现有查询的行为。启用后,您将能够使用 ANSI(标准)引用,但副作用是您不能再对字符串文字值使用双引号,但是,这也是一种非标准做法,仅适用于 MySQL,并且应该应避免。