当我尝试在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 *运行,它可以正常工作并返回正确的行数。
为什么这会在我的字符串“数据库”中途中断?
答案 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
感谢您的帮助!