关于phpmyadmin:MYSQL查询给出语法错误

MYSQL query gives syntax error

我正在phpmyadmin上运行此查询,它给出语法错误,

1
2
3
Delete from users_roles as ur where ur.uid NOT IN (select u.uid from users as u)

ERROR: 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as ur where ur.uid NOT IN (select u.uid from users as u)' at line 1

以及当我运行此查询时

1
select ur.uid from users_roles as ur where ur.uid NOT IN (select u.uid from users as u)

它给了我结果。


您不能使用DELETE语句形式的别名。应该是:

1
2
DELETE FROM users_roles
WHERE uid NOT IN (SELECT uid FROM users)

要使用别名,必须使用其他语法:

1
2
DELETE ur FROM users_roles AS ur
WHERE ur.uid NOT IN (SELECT uid FROM users)

此语法通常仅在DELETE语句中执行JOIN时使用,因此您需要引用JOIN中的特定表和列。当您仅引用一个表时不需要它。例如,您可以将查询重写为:

1
2
3
4
DELETE ur
FROM users_roles AS ur
LEFT JOIN users AS u ON ur.uid = u.uid
WHERE u.uid IS NULL

请参阅MySQL文档。 DELETE的第一种形式仅允许tbl_name,第二种形式允许table_references,后者是可以定义别名的位置。


请勿使用别名进行删除,请尝试以下操作
以users_roles.uid NOT IN的形式从users_roles中删除(从用户中以u身份选择u.uid)


尝试删除别名:

1
Delete from users_roles where uid NOT IN (select uid from users)

请参阅SQL Fiddle中的演示。

编辑:

在需要使用别名进行删除查询时(使用联接查询时),可以执行以下操作:

1
Delete ur from users_roles as ur where ur.uid NOT IN (select u.uid from users as u)