Mysql 以下删除查询有什么问题?

Mysql 以下删除查询有什么问题?,mysql,Mysql,我想在MYSQL中创建一个过程,它每小时运行一次,删除文档表中的所有条目。我想删除所有访问级别为5的文档,如果这些文档是由来自法国的人在一年后发布的,如果这些用户在发布文档时未满18岁 下面的代码给出了一个错误,并告诉我检查语法。 有没有人对如何修复代码以使其成为一个工作过程有任何想法 CREATE EVENT hourlydelete ON SCHEDULE EVERY 1 HOUR DO CALL delete_Document(); DELIMITER $$ CREATE PROCED

我想在MYSQL中创建一个
过程
,它每小时运行一次,删除
文档
表中的所有条目。我想删除所有访问级别为5的文档,如果这些文档是由来自法国的人在一年后发布的,如果这些用户在发布文档时未满18岁

下面的代码给出了一个错误,并告诉我检查语法。 有没有人对如何修复代码以使其成为一个工作过程有任何想法

CREATE EVENT hourlydelete
ON SCHEDULE EVERY 1 HOUR
DO CALL delete_Document();

DELIMITER $$ 
CREATE PROCEDURE delete_Document()
BEGIN
    DELETE FROM Document
    WHERE   (Document.idPerson = Person.idPerson AND Person.Country = 'France' AND Document.AccessLevel = 5)
    AND     ((DATEDIFF(Document.Posted,Person.DateOfBirth) / 365) < 18) 
    AND     ((DATEDIFF(NOW(), Document.Posted)/365) > 3)
    ORDER by Document.idPerson

    END
    $$
    DELIMITER;
CREATE EVENT hourlydelete
按计划每1小时
调用delete_Document();
分隔符$$
创建过程删除文档()
开始
从文档中删除
其中(Document.idPerson=Person.idPerson和Person.Country='France'和Document.AccessLevel=5)
和((DATEDIFF(文件已过账,个人出生日期)/365)<18)
和((DATEDIFF(NOW(),Document.Posted)/365)>3)
按Document.idPerson订购
结束
$$
定界符;
删除

ORDER by Document.idPerson
因为您没有使用
SELECT
查询,所以没有要
orderby
的结果集

MySQL中
DELETE
语句的多表语法为

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id = t2.id AND t2.id = t3.id;
t1
t2
(使用
之前)删除记录,但不从
t3
删除记录

所以,你实际上需要使用

DELETE FROM Document USING Document INNER JOIN Person
WHERE ...

这样可以确保仅删除
文档
记录,并且
人员
仅用于指定标准。另外,请注意,
ORDER BY
LIMIT
不能与多表
DELETE
s一起使用。

您缺少分号
DELETE
语句的末尾

此外,您的条件似乎是“a)或b)或c)”,但您可能需要
逻辑时,使用了
逻辑

将主
运算符更改为
,并添加分号:

DELETE FROM Document
WHERE (Document.idPerson = Person.idPerson AND Person.Country = 'France' AND Document.AccessLevel = 5)
OR ((DATEDIFF(Document.Posted,Person.DateOfBirth) / 365) < 18) 
OR ((DATEDIFF(NOW(), Document.Posted)/365) > 3); -- Add a semi colon!
从文档中删除
其中(Document.idPerson=Person.idPerson和Person.Country='France'和Document.AccessLevel=5)
或((DATEDIFF(文件已过账,个人出生日期)/365)<18)
或者((DATEDIFF(NOW(),Document.Posted)/365)>3);--添加分号!

谢谢,但是查询的其余部分是否符合我想要的3个条件?delete语句中的order by子句在mysql中是有效的,因为mysql也允许带有delete的limit子句。删除它不会有任何效果。@Bohemian嗨,如果不是Bohemian的Order by子句,您对导致问题的原因有什么建议吗?@corybaxter看到我的答案了@corybaxter,请检查我的答案中更新的多表MySQL语法。但我希望所有条件都满足,只有这样它才能删除数据。OR语句是否可以执行此任务?是否确实要
???这似乎不太可能——它们都是合理的理由,而条件是不相关的。order by的存在或不存在对删除哪些行没有影响-这只关系到删除时的
限制
claus。如果来自法国的人在一年后发布了访问级别为5的所有文档,如果这些用户在发布文档时未满18岁,我想删除这些文档。另外该过程将在小时内运行,并将删除运行该过程时超过3年的任何合格文档。我认为OP需要,但和/或不应导致语法错误。它应该无法删除正确的记录。