2011-09-28 49 views
8
id  lat    long  speed  date   address 
1 22.92138131 72.44103313  3.96 km/h  2011-09-26 National, Gujarat, India 
2 22.92138145 72.44103413  13.96 km/h  2011-09-26 National, Gujarat, India 
3 22.92138134 72.44103423  15.96 km/h  2011-09-26 National, Gujarat, India 
4 22.92138454 72.44103233  13.96 km/h  2011-09-26 10t ring Rd, Nehru Nagar 
5 22.92138354 72.44102533  13.96 km/h  2011-09-26 Anandnagar Rd, Ahmedabad 
6 22.92138484 72.44103293  19.96 km/h  2011-09-26 Anandnagar Rd, Ahmedabad 

重复行我想编写一个查询,使得我的结果是这样的:删除从表

id  lat    long  speed  date   address 
1 22.92138131 72.44103313  3.96 km/h  2011-09-26 National, Gujarat, India 
4 22.92138454 72.44103233  13.96 km/h  2011-09-26 10t ring Rd, Nehru Nagar 
5 22.92138354 72.44102533  13.96 km/h  2011-09-26 Anandnagar Rd, Ahmedabad 

我想根据地址删除重复的行。

+2

请仔细阅读http://en.wikipedia.org/wiki/Database_normalization – YXD

+0

如果地址重复,您希望返回结果集中的哪一行?首先通过ID? –

+0

身份证2在不重复任何其他行..你为什么要删除这也.. –

回答

2

假设你想用最小的ID值返回行:

SELECT 
    * 
FROM 
TABLENAME T INNER JOIN 
(
    SELECT MIN(ID) AS ID FROM TableName 
    GROUP BY Address 
) SUB ON T.ID = SUB.ID 
0
delete from table_name tb where id not in 
    (select min(id) from table_name tb1 group by address) 

我认为要删除其地址duplicacy行,并希望保持最小内径排在表

0

您可以通过这3个简单的步骤很容易地做到这一点,因此3个SQL语句:

步骤1:将非复制(独特的元组)成tempor ary table CREATE TABLE new_table as SELECT * FROM old_table WHERE 1 GROUP BY [column to remove duplicates by];

第2步:删除删除旧表 我们不再需要包含所有重复项的表,所以放下它! DROP TABLE old_table;

第3步:将new_table重命名为old_table的名称 RENAME TABLE new_table TO old_table;

另一种方式,你可以去到波纹管链接...它也是一个好办法...困难的,但用更少的语句 http://dev.mysql.com/doc/refman/5.0/en/insert.html

9

要检查你要删除的内容:

SELECT distinct t1.* 
    FROM yourtable as t1 
    join yourtable as t2 
WHERE t1.address = t2.address 
    and t1.id < t2.id 

如果你很高兴与:

DELETE t1 
    FROM yourtable as t1 
    join yourtable as t2 
WHERE t1.address = t2.address 
    and t1.id < t2.id 

这使得你可以记录与id列

最大值
+0

如果我需要保持低ID? –

+0

只需通过't1.id> t2.id'更改't1.id DavidEG

2

需要创建具有相同字段的重复/临时表,您当前的表具有什么。

然后执行SQL

下面

首先明确的临时表:在临时表

DELETE FROM `#TMP_TABLE#`; 

插入记录,按您的期望。

INSERT INTO `#TMP_TABLE#` 
SELECT T . * 
FROM #TABLE# T 
INNER JOIN (
    SELECT MIN(ID) AS ID 
    FROM #TABLE# 
    GROUP BY address 
    ) SUB ON T.id = SUB.id 

从临时表

INSERT INTO #TABLE# SELECT * FROM `#TMP_TABLE#` 
+0

您确定无法通过一个查询来完成吗?检查我的答案,我错过了什么吗? – DavidEG

+0

@DavidEG,是的,这是可能的。你天才。你的解决方案是完美的 –

+0

@ maulik.patel,你可以在更复杂的条件下使用上述逻辑 –

4

截断主表

DELETE FROM `#TABLE#`; 

复制数据如果你不关心你把该行的

ALTER IGNORE TABLE table ADD UNIQUE KEY 'address' (`address`); 

的“ IGNORE'很重要,那就意味着默默地忽略du重复数据。 (即插入到表中的“新版本”时,忽略它。)

可能想要删除索引afterwoods

ALTER TABLE table DROP KEY 'address';