MySQL Delete Distinct - IE 保留任何重复的删除唯一性

MySQL Delete Distinct - IE Keep any duplicate delete unique

大家好,第一次发帖,但之前从这个平台上的人那里得到了一些很棒的想法。 刚刚学习并开始将 MySQL 用于大型数据库,发现一个问题,我无法找到如何执行此操作的答案。

我有一个 table 结构如下:

|dt|ID|Location ID|
|--|--|-----------|
|21/03/2021 10:57:12|ab123|1234|
|21/03/2021 10:57:12|ab127|19826|
|21/03/2021 10:57:12|ab123|1721|
|21/03/2021 10:57:12|ab124|7656|
|21/03/2021 10:57:12|ab130|1001|
|21/03/2021 10:57:12|ab335|1991|
|21/03/2021 10:57:12|ab123|0010|

我想做的是删除具有匹配的单个 ID 的所有条目。本质上删除任何不同的 ID。

所以这会 return:

|dt|ID|Location ID|
|--|--|-----------|
|21/03/2021 10:57:12|ab123|1234|
|21/03/2021 10:57:12|ab123|1721|
|21/03/2021 10:57:12|ab123|0010|

命令DELETE(Distinct 'ID') from table;理想情况下是我想做的,但这无效?

使用子选择获取应删除的 ID

CREATE TABLE table1
    (`dt` varchar(19), `ID` varchar(5), `Location ID` int)
;
    
INSERT INTO table1
    (`dt`, `ID`, `Location ID`)
VALUES
    ('21/03/2021 10:57:12', 'ab123', 1234),
    ('21/03/2021 10:57:12', 'ab127', 19826),
    ('21/03/2021 10:57:12', 'ab123', 1721),
    ('21/03/2021 10:57:12', 'ab124', 7656),
    ('21/03/2021 10:57:12', 'ab130', 1001),
    ('21/03/2021 10:57:12', 'ab335', 1991),
    ('21/03/2021 10:57:12', 'ab123', 0010)
;
DELETE FROM table1 WHERE ID IN (seLECt `ID` FROM (SELECT ID FROM table1) t1  GROUP BY ID HAVING COUNT(*) = 1)
SELECT * FROM table1
dt                  | ID    | Location ID
:------------------ | :---- | ----------:
21/03/2021 10:57:12 | ab123 |        1234
21/03/2021 10:57:12 | ab123 |        1721
21/03/2021 10:57:12 | ab123 |          10

db<>fiddle here

这个版本有inner join

CREATE TABLE table1
    (`dt` varchar(19), `ID` varchar(5), `Location ID` int)
;
    
INSERT INTO table1
    (`dt`, `ID`, `Location ID`)
VALUES
    ('21/03/2021 10:57:12', 'ab123', 1234),
    ('21/03/2021 10:57:12', 'ab127', 19826),
    ('21/03/2021 10:57:12', 'ab123', 1721),
    ('21/03/2021 10:57:12', 'ab124', 7656),
    ('21/03/2021 10:57:12', 'ab130', 1001),
    ('21/03/2021 10:57:12', 'ab335', 1991),
    ('21/03/2021 10:57:12', 'ab123', 0010)
;
DELETE table1 FROM table1
        INNER JOIN  (seLECt `ID` FROM (SELECT ID FROM table1) t1  GROUP BY ID HAVING COUNT(*) = 1) t1
     ON table1.ID = t1.ID 
;
SELECT * FROM table1
dt                  | ID    | Location ID
:------------------ | :---- | ----------:
21/03/2021 10:57:12 | ab123 |        1234
21/03/2021 10:57:12 | ab123 |        1721
21/03/2021 10:57:12 | ab123 |          10

db<>fiddle here