Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 无法删除包含GROUP BY和HAVING子句的语句_Mysql_Sql_Qsqlquery - Fatal编程技术网

Mysql 无法删除包含GROUP BY和HAVING子句的语句

Mysql 无法删除包含GROUP BY和HAVING子句的语句,mysql,sql,qsqlquery,Mysql,Sql,Qsqlquery,我试图通过下面的SQL语句删除一些记录,但我得到了错误1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解第12行“GROUP BY tsa_u.task_attachment_id H”附近使用的正确语法: 有人知道我如何解决这个错误吗 DELETE ta FROM `tasks_recursive` AS tr INNER JOIN `tasks_attachments` AS tsa ON tsa.task_id = tr.id INNER JOIN `

我试图通过下面的SQL语句删除一些记录,但我得到了错误1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解第12行“GROUP BY tsa_u.task_attachment_id H”附近使用的正确语法:

有人知道我如何解决这个错误吗

DELETE
    ta
FROM `tasks_recursive` AS tr
INNER JOIN `tasks_attachments` AS tsa ON tsa.task_id = tr.id
INNER JOIN `task_attachments` AS ta ON tsa.task_attachment_id = ta.id AND ta.creator_id = 279
INNER JOIN (
    `tasks_attachments` AS tsa_
    INNER JOIN `tasks_recursive` AS tr_ ON tr_.id = tsa_.task_id
) ON tsa_.task_attachment_id = tsa.task_attachment_id
WHERE
    ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
GROUP BY
    tsa_.task_attachment_id
HAVING
    COUNT( DISTINCT( tr_.task_id ) ) = 1
我还尝试了下面的句子,在那里我得到了这个错误1064-你的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以了解第12行“GROUP BY tsa_u.task_attachment_id have COUNT DISTINCT tr_u.task_id”附近使用的正确语法:

最后尝试了双重包装,但也没有成功,这是错误1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第25行“AS sub”附近使用的正确语法:

试一试


没错,MySQL的DELETE支持借用SELECT语法的几个子句,例如JOIN和LIMIT,但不是所有的子句。不支持GROUP BY和HAVING

当我读到你的问题时,它似乎比你提出的要简单。您确实想删除只属于一个任务id的任务附件。并且您对文件名和创建者id有一些条件

您可以使用排除联接来实现此目的。也就是说,尝试连接到引用相同附件id的不同任务,如果找不到,则外部连接将返回null。然后在WHERE子句中测试null,当这种情况发生时,您发现只有一个任务id引用了一个附件

DELETE 
    ta
FROM task_attachments AS ta
INNER JOIN tasks_attachments AS tsa1 
    ON tsa1.task_attachment_id = ta.id
LEFT OUTER JOIN tasks_attachments AS tsa2 
    ON tsa1.task_attachment_id = tsa2.task_attachment_id
    AND tsa1.task_id <> tsa2.task_id 
WHERE
    ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
    AND ta.creator_id = 279
    AND tsa2.task_attachment_id IS NULL;
我认为在这个查询中根本不需要引用task\u recursive,因为task\u id已经存在于tasks\u附件中

在你删除任何东西之前,最好先做一次选择,仔细检查我的重新表述是否满足你的需要

SELECT 
    ta.*
FROM task_attachments AS ta
INNER JOIN tasks_attachments AS tsa1 
    ON tsa1.task_attachment_id = ta.id
LEFT OUTER JOIN tasks_attachments AS tsa2 
    ON tsa1.task_attachment_id = tsa2.task_attachment_id
    AND tsa1.task_id <> tsa2.task_id 
WHERE
    ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
    AND ta.creator_id = 279
    AND tsa2.task_attachment_id IS NULL;

从表中删除查询中的某个列添加另一个子查询这是一个已知的mysql限制从查询中的SELECT列删除SomeAliashi,感谢这两个答案。在发布之前,我在谷歌上搜索了一下,所以我已经尝试了建议的解决办法,但没有成功。我发布了SQL查询和错误,以防万一。你的子查询能检索到任何ID吗?非常感谢,你在解决我的问题时写了一个更简单的句子。非常感谢男士:D DELETE FROM `task_attachments` WHERE `task_attachments`.id IN ( SELECT ta_.id FROM `task_attachments` AS ta_ WHERE ta_.id IN ( SELECT ta.id AS taId FROM `tasks_recursive` AS tr INNER JOIN `tasks_attachments` AS tsa ON tsa.task_id = tr.id INNER JOIN `task_attachments` AS ta ON tsa.task_attachment_id = ta.id AND ta.creator_id = 279 INNER JOIN ( `tasks_attachments` AS tsa_ INNER JOIN `tasks_recursive` AS tr_ ON tr_.id = tsa_.task_id ) ON tsa_.task_attachment_id = tsa.task_attachment_id WHERE ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' ) GROUP BY tsa_.task_attachment_id HAVING COUNT( DISTINCT( tr_.task_id ) ) = 1 ) AS sub )
DELETE
FROM `task_attachments`
WHERE `task_attachments`.id IN
(
SELECT
taId
FROM 
(
    SELECT
        ta.id AS taId
    FROM `tasks_recursive` AS tr
    INNER JOIN `tasks_attachments` AS tsa ON tsa.task_id = tr.id
    INNER JOIN `task_attachments` AS ta ON tsa.task_attachment_id = ta.id AND ta.creator_id = 279
    INNER JOIN (
        `tasks_attachments` AS tsa_
        INNER JOIN `tasks_recursive` AS tr_ ON tr_.id = tsa_.task_id
    ) ON tsa_.task_attachment_id = tsa.task_attachment_id
    WHERE
        ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
    GROUP BY
        tsa_.task_attachment_id
    HAVING
        COUNT( DISTINCT( tr_.task_id ) ) = 1
    ) AS sub
)
DELETE 
    ta
FROM task_attachments AS ta
INNER JOIN tasks_attachments AS tsa1 
    ON tsa1.task_attachment_id = ta.id
LEFT OUTER JOIN tasks_attachments AS tsa2 
    ON tsa1.task_attachment_id = tsa2.task_attachment_id
    AND tsa1.task_id <> tsa2.task_id 
WHERE
    ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
    AND ta.creator_id = 279
    AND tsa2.task_attachment_id IS NULL;
SELECT 
    ta.*
FROM task_attachments AS ta
INNER JOIN tasks_attachments AS tsa1 
    ON tsa1.task_attachment_id = ta.id
LEFT OUTER JOIN tasks_attachments AS tsa2 
    ON tsa1.task_attachment_id = tsa2.task_attachment_id
    AND tsa1.task_id <> tsa2.task_id 
WHERE
    ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
    AND ta.creator_id = 279
    AND tsa2.task_attachment_id IS NULL;