MySQL查询失败。错误消息未显示我的完整查询 - 切断字符串

时间:2015-06-18 18:56:35

标签: 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 - 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 *运行,它可以正常工作并返回正确的行数。

为什么这会在我的字符串“数据库”中途中断?

2 个答案:

答案 0 :(得分:0)

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

在您的情况下,错误位于... mdl_enrol n1 ...。根据{{​​3}},在DELETE语法中,不允许在SELECT查询中指定表别名。因此,您必须在不使用n1别名的情况下重写查询,并仅使用完整的表名mdl_enrol

答案 1 :(得分:0)

啊,谢谢你指出我的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_enrol(使用SELECT * FROM mdl_enrol)为n2

这取自this guide

感谢您的帮助!