2011-09-28 82 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';