【问题标题】:mySQL delete row with count(*) GROUP and HAVINGmySQL 删除带有 count(*) GROUP 和 HAVING 的行
【发布时间】:2019-02-20 09:13:54
【问题描述】:

我有这个查询,我得到所有具有相同 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 count sql-delete having-clause


【解决方案1】:

假设 id 是表 s_articles_categories 的主键,您可以对子选择结果使用连接。

删除所有行:

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 

【讨论】:

  • @GMB .. 感谢您的编辑 ..(我有一些书写困难的问题,当我用英语写作时会加重).. 非常感谢 .. 赞成
【解决方案2】:

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

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
)

【讨论】:

  • 谢谢。但我只需要删除类别为 2153 的重复项
  • @user3586022 :查询已更新。但是,如果您想删除 所有 个重复项(@scaisEdge 回答)或在每个组中保留一个(我的回答),您仍然需要告诉使用。
【解决方案3】:

我建议这样写:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2021-01-28
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多