【问题标题】:Deleting duplicates from listed records with SQL in PhpMyAdmin在 PhpMyAdmin 中使用 SQL 从列出的记录中删除重复项
【发布时间】:2016-01-23 23:00:40
【问题描述】:

我正在使用此命令在我的数据库中查找city 列中具有相同值的记录:

SELECT city, COUNT(*) c FROM allCity GROUP BY city HAVING c > 1;

当我在 PhpMyAdmin 中运行它时,我得到一个包含两列的巨大列表,第一列是 city,第二列是 c。我假设c 列中的数字显示了重复条目的数量,但我无法真正列出重复项,但也许不需要。

所以我的目标是从运行上述命令后得到的列表中删除所有重复项。不幸的是,这是我第一次使用 sql 命令,因此如果有人能告诉我应该如何扩展我现有的代码或者我应该实现什么才能做到这一点,我将非常感激?基本上我只想删除city 列具有相同值的每条记录,除了第一条记录。例如,如果我有 3 条记录,在 city 列中的值为 New York,我想删除两条并保留一条。删除哪两个无关紧要。

【问题讨论】:

  • 有几种解决方案。但是重要的信息,你的表有一些 id / 主键?
  • @JuanCarlosOropeza 是的,我有一个名为objId 的列,因此每条记录都有一个唯一标识符。
  • 如果您只是选择city 列,您可以执行SELECT DISTINCT city FROM allCity;,它将为您提供city 列的所有唯一值。然而,我觉得这里试图解决一个不同的问题,而不仅仅是这个。如果您发布了确切的问题,这将很有帮助。如果没有,这应该会让你继续前进。
  • @munircontractor - 这是问题所在,.. 我刚刚开始编写 sql 代码,所以我的问题很简单 :)

标签: mysql sql


【解决方案1】:

如果存在其他同名但ID较小的城市,则删除一个城市。所以最后只有小 id 会保留在 db 中。

DELETE FROM allCity AS c
WHERE exists (select tid 
              from allCity c2
              where c2.name = c.name
                and c2.id < c.id);

【讨论】:

    【解决方案2】:

    这完全取决于数据的存储方式、数据库的大小等。

    我通常使用类似这样的查询:

    DELETE dup FROM allCity AS original 
    LEFT JOIN allCity AS dup 
    ON dup.city = original.city AND 
    dup.objId != original.objId;
    

    此语句选择所有城市,加入同一个表,但前提是主 ID 不同。在这种情况下,甚至不需要 WHERE 子句,因为我们说我们只删除重复项(因此 ID 与原始记录不同)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2020-07-16
      • 2021-02-13
      • 2022-07-13
      • 1970-01-01
      相关资源
      最近更新 更多