【问题标题】:MySQL error 1064: SQL syntax error in SELECT statementMySQL 错误 1064:SELECT 语句中的 SQL 语法错误
【发布时间】:2015-05-06 05:53:53
【问题描述】:

我对一些高级的 MySQL 查询比较陌生。我一直在尝试使用以下 MySQL 查询使用 MySQL SELECT 语句查询特定用户的订单表中的最新订单。

SELECT o1.* FROM order AS o1
WHERE o1.orderDateTime = 
( 
  SELECT MAX(o2.orderDateTime) FROM order AS o2
  WHERE o2.userId = '1'
) 

但我一直收到以下与 MySQL 语法相关的 MySQL 错误 #1064。

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“order AS o1 WHERE o1.orderDateTime = (SELECT MAX(o2.orderDateTime)FROM order AS”附近使用正确的语法

我遇到了与 INSERT 语句相关的类似错误,但我设法使用MySQL 1064: You have an error in your SQL syntax 中指定的方法修复它 我尽一切努力修复当前情况下的查询,但仍然没有成功。

如果有人能帮我解决上面指定的 SELECT 子句的这个 MySQL 语法错误,我将不胜感激。如果有人也可以指定我发生此问题的确切原因,那就太好了。

【问题讨论】:

  • order 是保留字,使用后缀转义

标签: php mysql


【解决方案1】:

order 是一个保留字,它是表名的错误选择。您需要在查询中使用反引号进行转义

SELECT o1.* FROM `order` AS o1
WHERE o1.orderDateTime = (
    SELECT MAX(o2.orderDateTime) FROM `order` AS o2
    WHERE o2.userId = '1'
) 

http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-5.html

【讨论】:

  • 是的,它对我有用......也明白了原因......非常感谢
【解决方案2】:

根据@Abhik,order 是 MySQL 关键字。

你应该用两种方法避免崩溃:

  1. 使用反引号 (`)(@Abhik 已经对此进行了解释。)
  2. 在表名之前添加数据库名称,例如 DataBase_Name.order

但是,@Abhik 的方法仍然更可取,因为在数据库名称更改的情况下,您需要在查询中更改数据库名称。

【讨论】:

  • 您指的是 Abhik 对您提到的几乎所有内容的回答。因此,最好为答案投票而不是添加新答案。
  • @sgtBose,感谢您的评论。我已经投了赞成票。但是,我只想提一下,还有第二种方法可以解决问题以及参考答案。
【解决方案3】:

首先,您可以按照@Abhik Chakraborty 的建议在订单表名称周围添加反引号。 order 是 mysql 中的保留字。我的建议是改进你的 sql 查询。您可以使用以下方法完成相同的操作:

SELECT o1.* FROM `order` o1
WHERE  o1.userId = '1' order by orderDateTime desc limit 1

子查询似乎没有必要。

【讨论】:

  • 请注意,如果目的是让此查询进一步用于形成其他查询,则这并没有多大用处
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2023-02-24
  • 2017-04-23
相关资源
最近更新 更多