我使用临时表删除了mysql表中的重复行。没有使用它可以做到吗?我搜索了很多,但没有找到任何解决方案。
number | status | service 1234 | A | x1 1234 | D | x1 1234 | D | x1 1234 | A | x2 1234 | D | x2 2345 | A | x1
我的基本需求是,对于特定数字和服务,应该只有一行是instatus d。表中有很多条目
答案 0 :(得分:1)
您可以尝试这样的事情: -
DELETE t1 FROM table t1, table t2 WHERE t1.name = t2.name AND t1.id > t2.id;
提供的名称和ID是表格中的列
结帐link
答案 1 :(得分:1)
一个可能的解决方案是让MySql通过UNIQUE
选项(将错误视为警告)应用IGNORE
约束来有效地重复删除表
ALTER TABLE Table1 ENGINE MyISAM; -- this obviously needed only if your ENGINE is not MyISAM
ALTER IGNORE TABLE Table1 ADD UNIQUE (`number`, `status`, `service`);
ALTER TABLE Table1 ENGINE InnoDB; -- again this is only needed if your ENGINE was other than MyISAM
之后你会得到:
| NUMBER | STATUS | SERVICE | ----------------------------- | 1234 | A | x1 | | 1234 | A | x2 | | 1234 | D | x1 | | 1234 | D | x2 | | 2345 | A | x1 |
这是 SQLFiddle 演示
<小时/> 由于 ...还有一列是序列号并自动递增... 另一个选择是使用像
这样的查询
DELETE t
FROM Table1 t JOIN
(
SELECT number, status, service, MAX(serial) serial
FROM Table1
GROUP BY number, status, service
HAVING COUNT(*) > 1
) q ON t.number = q.number
AND t.status = q.status
AND t.service = q.service
AND t.serial <> q.serial
结果是一样的:
| SERIAL | NUMBER | STATUS | SERVICE | -------------------------------------- | 1 | 1234 | A | x1 | | 4 | 1234 | A | x2 | | 3 | 1234 | D | x1 | | 5 | 1234 | D | x2 | | 6 | 2345 | A | x1 |
这是 SQLFiddle 演示