0

我有两个表 (id_test, test) ,每个表都有一个 ID 列,它是唯一的,并且两个表中具有相同 id 的两个条目是相同的。现在,我在其中一个表(id_test)中有另一列也应该是唯一的,所以我想根据另一列消除重复项,我们称之为 YD。

识别我使用的重复项

SELECT ID, YD AS x, COUNT(*) AS y
FROM id_test 
GROUP BY x 
HAVING y>1;

现在,我想删除两个表中的这些条目。我该怎么做?

4

3 回答 3

1

ALTER TABLE语法中所述(强调添加):

IGNORE是标准 SQL 的 MySQL 扩展。ALTER TABLE如果新表中的唯一键有重复项,或者在启用严格模式时出现警告,它会控制如何工作。如果IGNORE未指定,则在发生重复键错误时中止并回滚副本。如果IGNORE指定,则仅第一行用于在唯一键上具有重复项的行。其他冲突的行被删除。不正确的值将被截断为最接近的匹配可接受值。

所以:

ALTER IGNORE TABLE id_test ADD UNIQUE (YD)
于 2012-11-20T13:21:45.330 回答
1

此查询显示表ID中每个YD的第一个id_test

SELECT ID, YD
FROM id_test
GROUP BY YD

这些是您必须保留的行。以下查询返回您必须删除的 ID:

SELECT id_test.ID
FROM id_test LEFT JOIN (select ID, YD from id_test group by YD) id_test_keep
     on id_test.ID=id_test_keep.ID and id_test.YD = id_test_keep.YD
WHERE id_test_keep.ID IS NULL

现在我想我需要更多关于你的桌子的细节,但我认为你需要的是:

DELETE FROM test
WHERE
  test.ID IN (
    SELECT id_test.ID
    FROM id_test LEFT JOIN (select ID, YD from id_test group by YD) id_test_keep
         on id_test.ID=id_test_keep.ID and id_test.YD = id_test_keep.YD
    WHERE id_test_keep.ID IS NULL)
于 2012-11-20T14:22:35.653 回答
0

我认为您不要用户选择,因为如果数据很大,那是不可能的。您应该克隆一个具有相同结构的表。插入不重复的数据。

INSERT INTO test_new (ID, YD) SELECT t.ID, t.YD FROM test t LEFT JOIN test_id ti ON t.ID = ti.id WHERE ti.id IS NULL;

删除表测试后,重命名 test_new -> test。

于 2016-01-07T09:01:17.007 回答