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
大家好,第一次发帖,但之前从这个平台上的人那里得到了一些很棒的想法。 刚刚学习并开始将 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