2015-03-02 95 views
1

我有一个数据库,其中表包含连续的重复行。有数据表的演示如下。从mysql中的表中删除连续的重复信息

id name processed 
1 xyz  0 
2 xyz  0 
3 ABC  0 
4 ABC  0 

我想从该表中删除重复的连续的,一旦重复删除更新处理,以1这样的决赛桌的样子如下。

id name processed 
1 xyz  1 
3 ABC  1 

我这样做如下。

SET @v1 := (select group_concat(`id`) from `names` as m1 where 0 < (select count(*) from `names` as m2 where m2.`id` = m1.`id` - 1 and m2.`name` = m1.`name`)); 
DELETE FROM names WHERE id IN (@v1); 
UPDATE names SET `processed`=1 WHERE `processed`=0 

该查询工作正常,但一次删除一行。请帮助我。我想要删除所有选定的行。 在此先感谢。

+0

'DELETE FROM表WHERE名称=名称和ID> id' – 2015-03-02 08:13:52

回答

0

对于PHPMySQL的,如果你的所有数据是连续配对,那么这将正常工作。

$con = mysqli_connect('host', 'user', 'pass', 'db'); 
$query ="select m1.id from names as m1 where 0 < (select count(*) from names as m2 where m2.id = m1.id - 1 and m2.name = m1.name)"; 
$result = mysqli_query($con, $query); 
while($row = mysqli_fetch_array($result)){ 
    $query2 ="DELETE FROM names WHERE id = ".$row['id']; 
    mysqli_query($con, $query2); 
    $id = $row['id']-1; 
    $query3 ="UPDATE names SET `processed`=1 WHERE id = ".$id; 
    mysqli_query($con, $query3); 
} 

我检查了它,它的工作正常。希望它也适用于你。

1

由于@MarkBaker已发表评论,您可以尝试DELETE FROM table WHERE name=name and id>id

但这只适用于已经完成的工作。要阻止那,你应该加unique索引到name列。这应该可以防止未来添加任何重复项。

您不能设置,当你有重复的,所以你需要清洁第一:)

+0

这是好的,但我还需要删除重复后更新处理的值。你不觉得这种方式的查询比比较连续的行要花费很多时间吗?据我所知,重复总是连续的。数据从某个地方传出,我只有数据库。所以你建议我不能实现。 – user2656780 2015-03-04 12:49:46

-1

这不会修改你的表,但会给你想要的结果选择unique指数:

SELECT min(id) id, name, 1 processed 
FROM mytable 
GROUP BY name 

您可以在CREATE TABLE newtable AS SELECT ...,然后DROP mytable,最后使用ALTER TABLE newtable RENAME TO mytable

-1

DISTINCT关键字可用于仅返回不同的(不同的)值。 使用此查询:

SELECT DISTINCT `id`, `name`,`1` AS processed 
FROM mytable; 
1

您不能在相同的查询中更新和删除。所以这几乎让你这一点:

DROP TABLE IF EXISTS my_table; 
CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,name CHAR(3) NOT NULL,processed TINYINT NOT NULL DEFAULT 0); 

INSERT INTO my_table VALUES 
(1 ,'xyz',  0), 
(2 ,'xyz',  0), 
(3 ,'ABC',  0), 
(4 ,'ABC',  0); 

SELECT * FROM my_Table; 
+----+------+-----------+ 
| id | name | processed | 
+----+------+-----------+ 
| 1 | xyz |   0 | 
| 2 | xyz |   0 | 
| 3 | ABC |   0 | 
| 4 | ABC |   0 | 
+----+------+-----------+ 

SELECT y.* FROM my_table x JOIN my_table y ON y.id = x.id + 1 AND y.name = x.name; 
+----+------+-----------+ 
| id | name | processed | 
+----+------+-----------+ 
| 2 | xyz |   0 | 
| 4 | ABC |   0 | 
+----+------+-----------+ 

DELETE y FROM my_table x JOIN my_table y ON y.id = x.id + 1 AND y.name = x.name; 
Query OK, 2 rows affected (0.00 sec) 


UPDATE my_table SET processed = 1; 
Query OK, 2 rows affected (0.00 sec) 

SELECT * FROM my_table; 
+----+------+-----------+ 
| id | name | processed | 
+----+------+-----------+ 
| 1 | xyz |   1 | 
| 3 | ABC |   1 | 
+----+------+-----------+