0

我已经使用临时表删除了 mysql 表中的重复行。不使用它可以做到吗?我进行了很多搜索,但没有找到任何解决方案。

号码 | 状态 | 服务
第1234章 一个 | x1
第1234章 D | x1
第1234章 D | x1
第1234章 一个 | x2
第1234章 D | x2
第2345章 一个 | x1

我的基本需求是,对于特定的号码和服务,应该只有一行是 instatus d。表中有很多条目

4

2 回答 2

2

你可以尝试这样的事情: -

DELETE t1 FROM table t1, table t2 WHERE t1.name = t2.name AND t1.id > t2.id;

提供的 name 和 id 是表中的列

签出此链接

于 2013-08-06T20:13:54.980 回答
1

一个可能的解决方案是让 MySqlUNIQUE使用选项应用约束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

之后你会得到:

| 号码 | 状态 | 服务 |
-----------------------------------------
| 第1234章 一个 | x1 |
| 第1234章 一个 | x2 |
| 第1234章 D | x1 |
| 第1234章 D | x2 |
| 第2345章 一个 | 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

结果是一样的:

| 连载 | 号码 | 状态 | 服务 |
--------------------------------------
| 1 | 第1234章 一个 | x1 |
| 4 | 第1234章 一个 | x2 |
| 3 | 第1234章 D | x1 |
| 5 | 第1234章 D | x2 |
| 6 | 第2345章 一个 | x1 |

这是SQLFiddle演示

于 2013-08-06T20:39:06.963 回答