反引号引用导致sql查询错误

时间:2014-07-14 08:45:28

标签: 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`

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

3 个答案:

答案 0 :(得分:3)

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

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

 oc_product_to_category.product_id

应该是

 opc.product_id

我建议您删除所有反引号,然后编写标准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';

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

答案 1 :(得分:0)

更改

SELECT `text`,
       `oc_product_to_category.product_id`

SELECT `text`,
       `oc_product_to_category`.`product_id`

或者,如果字段/表名称不是保留字,则只需删除后面的刻度。这里text是mysql的保留字,因此它用反复写入,如

SELECT `text`,
       oc_product_to_category.product_id

您可以在字段名称,表格名称上放回标记。您只是将表格名称和字段名称组合在一起,这就是您收到错误的原因。

答案 2 :(得分:0)

oc_product_to_category.product_id

如果你想使用反引号,那么将它分别用于你的表和列,如下所示:

oc_product_to_categoryproduct_id

此外,您对表格别名,因此请使用别名,如下所示:

opcproduct_id

但在这种情况下你不需要反叛。