MySQL查询失败。错误消息不显示我的完整查询--在字符串处截断

MySQL查询失败。错误消息不显示我的完整查询--在字符串处截断,mysql,Mysql,当我尝试在phpmyadmin中或直接在cli中运行以下查询时 DELETE FROM mdl_enrol n1 WHERE n1.id > ( SELECT n2.id from mdl_enrol n2 WHERE n2.enrol = "database" AND n1.id > n2.id AND n2.courseid = n1.courseid ) AND n1.enrol = "database" 我收到以下错误消息: #1064 -

当我尝试在phpmyadmin中或直接在cli中运行以下查询时

DELETE FROM mdl_enrol n1 WHERE n1.id > (
    SELECT n2.id from mdl_enrol n2
    WHERE n2.enrol = "database"
    AND n1.id > n2.id
    AND n2.courseid = n1.courseid
)
AND n1.enrol = "database"
我收到以下错误消息:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'n1 WHERE n1.id > (SELECT n2.id from mdl_enrol n2 WHERE n2.enrol = "da' at line 1
如果我以SELECT*的形式运行该命令,它将正常工作并返回正确的行数


为什么在我的字符串“database”中会一直被截断?

正如注释中提到的,MySQL不会在错误消息中返回整个查询。您不需要它,因为您已经知道要提交哪个查询(如果是通过PHP完成的,您可以在执行之前“回显”查询)。MySQL总是从导致错误的第一个字符返回查询


在您的例子中,错误出现在
。。。mdl_入学
n1
..
。根据,在
DELETE
语法中,不允许像在
SELECT
查询中那样指定表别名。因此,您必须重写查询,而不使用
n1
别名,并且只使用完整的表名
mdl\u enrol

,如注释中所述,MySQL不会在错误消息中返回整个查询。您不需要它,因为您已经知道要提交哪个查询(如果是通过PHP完成的,您可以在执行之前“回显”查询)。MySQL总是从导致错误的第一个字符返回查询


在您的例子中,错误出现在
。。。mdl_入学
n1
..
。根据,在
DELETE
语法中,不允许像在
SELECT
查询中那样指定表别名。因此,您必须在不使用
n1
别名的情况下重写查询,并且只使用完整的表名
mdl\u enrol
Ahh,感谢您指出我的noob错误:)我在PHPmyadmin切断保存的查询时遇到了一些其他问题,因此我认为这两者之间存在某种关联,这让我很沮丧

无论如何,我找到了一个解决我的问题的方法,根据Marki555的答案。我必须修改我的查询,以便:

DELETE n1 FROM mdl_enrol AS n1 WHERE n1.id > (
    SELECT n2.id FROM (
        SELECT * FROM mdl_enrol
        ) AS n2
    WHERE n2.enrol = "database"
    AND n1.id > n2.id
    AND n2.courseid = n1.courseid
)
AND n1.enrol = "database"
是的,DELETE语法不直接允许您使用别名,但您可以使用AS语法

然后我遇到了不允许在WHERE子句中定义别名(对于n2)的问题,因此我必须在WHERE子句中创建一个单独的FROM子句,将mdl_注册(使用SELECT*FROM mdl_注册)定义为n2

这是从


谢谢你的帮助

啊,谢谢你指出我的noob错误:)我在PHPmyadmin切断我保存的查询时遇到了一些其他问题,所以我认为这两者之间有某种联系,这让我很沮丧

无论如何,我找到了一个解决我的问题的方法,根据Marki555的答案。我必须修改我的查询,以便:

DELETE n1 FROM mdl_enrol AS n1 WHERE n1.id > (
    SELECT n2.id FROM (
        SELECT * FROM mdl_enrol
        ) AS n2
    WHERE n2.enrol = "database"
    AND n1.id > n2.id
    AND n2.courseid = n1.courseid
)
AND n1.enrol = "database"
是的,DELETE语法不直接允许您使用别名,但您可以使用AS语法

然后我遇到了不允许在WHERE子句中定义别名(对于n2)的问题,因此我必须在WHERE子句中创建一个单独的FROM子句,将mdl_注册(使用SELECT*FROM mdl_注册)定义为n2

这是从


谢谢你的帮助

这是因为错误消息只提供了导致问题的sql的一个片段。它永远不会是整个查询,除非您的查询足够短,能够满足正常的错误消息长度限制。SQL错误不会返回整个查询字符串,只足以指出错误所在。如果他们这样做了,这将是一个巨大的安全问题。查询中的错误是您在delete语句中错误地给表添加了别名。这是因为错误消息只提供了导致问题的sql的一个片段。它永远不会是整个查询,除非您的查询足够短,能够满足正常的错误消息长度限制。SQL错误不会返回整个查询字符串,只足以指出错误所在。如果他们这样做了,这将是一个巨大的安全问题。查询中的错误是您在delete语句中错误地给表添加了别名。这是因为错误消息只提供了导致问题的sql的一个片段。它永远不会是整个查询,除非您的查询足够短,能够满足正常的错误消息长度限制。SQL错误不会返回整个查询字符串,只足以指出错误所在。如果他们这样做了,这将是一个巨大的安全问题。查询中的错误是您在delete语句中错误地给表添加了别名。