mySQL使用count(*)GROUP和HAVING删除行

问题描述 投票:0回答:3

我有这个查询,我得到所有双条目与相同的articleID和categoryID = 2153现在我想删除这些行。但这似乎不能直接起作用。所以我尝试使用子查询,但是当我使用IN时,我需要一个只返回id的子查询。但这也是不可能的。

如何从此查询中删除行?

SELECT id, articleID, categoryID, count(*) AS count 
FROM `s_articles_categories`
GROUP BY articleID
HAVING count(*) > 1 AND categoryID = 2153
mysql sql having
3个回答
2
投票

假设id是表s_articles_categories的主键您可以在subselect结果上使用连接。

要删除所有行:

delete  r.* 
from s_articles_categories r
INNER JOIN (
    SELECT id, articleID, categoryID, count(*) AS count FROM
    `s_articles_categories` r
    GROUP BY articleID
   HAVING count(*) > 1 AND categoryID = 2153

) t on t.id = r.id 

1
投票

如果要删除所有重复项但在每个组中保留其中一个副本,则可以使用以下查询:

DELETE FROM `s_articles_categories` s
WHERE s.categoryID = 2153 AND EXISTS (
    SELECT 1 
    FROM `s_articles_categories` s1
    WHERE s1.articleID = s.articleID AND s1.categoryID = s.categoryID AND s1.id < s.id
)

0
投票

我建议写这个:

delete ac
    from s_articles_categories ac join
         (select articleId, categoryid, min(id) as min_id
          from s_articles_categories
          where categoryID = 2153
          group by articleId, categoryid
         ) ac2
         on ac2.articleId = ac.articleId and
            ac2.categoryid = ac.categoryid and
            ac.id > ac2.min_id
© www.soinside.com 2019 - 2024. All rights reserved.