Mysql 无法删除包含GROUP BY和HAVING子句的语句
我试图通过下面的SQL语句删除一些记录,但我得到了错误1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解第12行“GROUP BY tsa_u.task_attachment_id H”附近使用的正确语法: 有人知道我如何解决这个错误吗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 `
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;