0

我正在尝试通过以下 SQL 语句删除一些记录,但出现错误#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 'GROUP BY tsa_.task_attachment_id H' at line 12

有谁知道我该如何解决这个错误?

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 - 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 'GROUP BY tsa_.task_attachment_id HAVING COUNT( DISTINCT( tr_.task_id ' at line 12

删除
    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
内部联接 (
    `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
在哪里
    ta.file_name IN ('000531994879c3bf.pdf', '000531994879c5a8.pdf')
通过...分组
    tsa_.task_attachment_id
拥有
    计数(DISTINCT(tr_.task_id))=1

上面的句子在将表链接到主表的表中查找task_attachments未被任何人 ecxept 本身使用的行。many_to_many tasks_attachmentsslave task_attachmentstasks_recursive

为了解决workaround上述问题,我尝试wrapabove query但我收到了这个错误#1093 - You can't specify target table 'ta_' for update in FROM clause

删除ta_
                FROM `task_attachments` AS ta_
                哪里 ta_.id 在
(
                    选择
                        ta.id
                    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
                    内部联接 (
                        `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
                    在哪里
                        ta.file_name IN ('000531994879c3bf.pdf', '000531994879c5a8.pdf')
                    通过...分组
                        tsa_.task_attachment_id
                    拥有
                        计数(DISTINCT(tr_.task_id))=1
                )

最后尝试了双包装,但也没有用,这是错误#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 sub )' at line 25

删除
FROM `task_attachments`
WHERE `task_attachments`.id IN
(
选择
ta_.id
FROM `task_attachments` AS ta_
哪里 ta_.id 在
(
    选择
        ta.id 说完
    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
    内部联接 (
        `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
    在哪里
        ta.file_name IN ('000531994879c3bf.pdf', '000531994879c5a8.pdf')
    通过...分组
        tsa_.task_attachment_id
    拥有
        计数(DISTINCT(tr_.task_id))=1
    ) 作为子
)
4

2 回答 2

2

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

当我阅读您的查询时,它似乎比您提出的要简单。您确实想删除仅属于一个 task_id 的 task_attachments。并且您对文件名和创建者 ID 有一些条件。

您可以为此使用排除连接。也就是说,尝试加入引用相同附件 id 的不同任务,如果没有找到,则 OUTER JOIN 将返回空值。然后您在 WHERE 子句中测试空值,当这种情况发生时,您会发现仅由一个 task_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_recursive 是必要的,因为 task_id 已经存在于 tasks_attachments 中。

在删除任何内容之前,当然最好先将其作为 SELECT 进行尝试,以仔细检查我的重新表述是否为您提供了所需的内容。

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;
于 2014-03-07T18:25:16.170 回答
0

尝试

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
)
于 2014-03-07T18:11:45.063 回答