【问题标题】:Delete duplicate rows from mySQL database where a column is duplicate从 mySQL 数据库中删除列重复的重复行
【发布时间】:2014-06-01 02:52:27
【问题描述】:

我有一个这样的 wordpress 表(phpmyadmin 和 MySQL)

| id |  meta_key | meta_value |
+----+-----------+------------+
| 1  | import_id | abc        |
| 2  | import_id | abc        |
| 3  | import_id | def        |
| 4  | import_id | xyz        |
| 5  | import_id | xyz        |
| 6  | import_id | xyz        |
| 7  | something | 123        |
| 8  | something | 234        |
+----+-----------+------------+

我需要获取 meta_key='import_id' 的所有重复行的 id

为了将它们从另一个表中删除。

我想保留“meta_value”相同的每个返回行的 MIN(id)

即输出应该是:

| id |  meta_key | meta_value |
+----+-----------+------------+
| 2  | import_id | abc        |
| 3  | import_id | def        |
| 6  | import_id | xyz        |
+----+-----------+------------+

或者只是

| id |
+----+
| 2  | 
| 3  | 
| 6  | 
+----+

请帮忙,虽然这可能是一个重复的问题,但我仍然遇到问题,因为我的 SQL 有点生疏了。

我可以像这样得到 meta_key='import_id' 的重复项:

SELECT id,meta_value
FROM TABLE 
WHERE meta_key='import_id'
GROUP BY meta_value
HAVING Count(meta_value) > 1

我想从中得到 NON MIN(id) 值

【问题讨论】:

    标签: mysql sql wordpress phpmyadmin duplicates


    【解决方案1】:

    以下查询应返回对的所有非最小 ID:

    select t.id
    from table t
    where t.meta_key = 'import_id' and
          exists (select 1
                  from table t2
                  where t2.meta_key = t.meta_key and
                        t2.meta_value = t.meta_value and
                        t2.id < t.id
                 );
    

    【讨论】:

    • 我得到 0 行返回:/
    【解决方案2】:
    SELECT MAX(id), meta_value, COUNT(*) AS DUPS
    FROM TABLE 
    WHERE meta_key='import_id'
    GROUP BY meta_value
    HAVING DUPS > 1;
    

    【讨论】:

      【解决方案3】:

      您需要在此处使用 MAX() 聚合函数,以获得所需的输出。

      您一直在使用“术语”NON MIN (id) - 现在这让我们很困惑。这意味着,您想要所有不是 MIN(id) 的 id,其中 meta_key = 'import_id'。如果是这样,您的输出应该与此类似:

       | id |
       +----+
       | 2  | 
       | 3  |
       | 4  | 
       | 5  | 
       +----+
      

      但是,如果您需要返回您在问题中演示的以下结果:

       | id |
       +----+
       | 2  | 
       | 3  | 
       | 6  | 
       +----+
      

      那么你必须使用MAX()函数。

      所以你的查询应该是这样的:

       SELECT MAX(id)
       FROM TABLE 
       WHERE meta_key='import_id'
       GROUP BY meta_value
       HAVING Count(meta_value) > 1
      

      或者如果你想返回所有列的结果,那么试试这个:

       SELECT DISTINCT MAX(id), meta_key, meta_value
       FROM TABLE 
       WHERE meta_key='import_id'
       GROUP BY meta_value
       HAVING Count(meta_value) > 1
      

      在这种情况下,您需要使用 SELECT DISTINCT

      【讨论】:

        猜你喜欢
        • 2013-10-07
        • 2023-04-02
        • 1970-01-01
        • 2017-10-11
        • 1970-01-01
        • 2019-07-28
        • 2018-11-20
        • 1970-01-01
        • 2022-01-10
        相关资源
        最近更新 更多