Mysql 从表中删除重复行

Mysql 从表中删除重复行,mysql,sql,Mysql,Sql,我想编写一个查询,使我的结果如下所示: 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, Gu

我想编写一个查询,使我的结果如下所示:

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值最小的行:

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

我假设您希望删除具有地址重复性的行,并希望在表中保留最小id行

您可以通过执行以下3个简单步骤,从而执行3条SQL语句,轻松完成此操作:

步骤1:将非重复(唯一元组)移动到临时表中 创建表格新表格作为 从旧_表中选择*,其中1个GROUP BY[删除重复项的列]

步骤2:删除旧表 我们不再需要包含所有重复项的表,所以请删除它! 放下旧桌子

步骤3:将新的_表重命名为旧的_表的名称 将新表重命名为旧表

另一种方式,你可以去下面的链接。。。这也是一个好方法。。。困难,但陈述较少
要检查要删除的内容,请执行以下操作:

delete from table_name tb where id not in 
   (select min(id) from table_name tb1 group by address)
选择distinct t1*
从您的表中选择t1
以t2的身份加入您的表
其中t1.address=t2.address
t1.id
如果您对此感到满意:

SELECT distinct t1.*
  FROM yourtable as t1
  join yourtable as t2
 WHERE t1.address = t2.address
   and t1.id < t2.id
删除t1
从您的表中选择t1
以t2的身份加入您的表
其中t1.address=t2.address
t1.id

通过这种方式,您可以在id列中保留最大值的记录。您需要使用与当前表相同的字段创建重复/临时表

然后在SQL下面执行

第一个清除临时表:

DELETE t1
  FROM yourtable as t1
  join yourtable as t2
 WHERE t1.address = t2.address
   and t1.id < t2.id
按照您的期望在临时表中插入记录

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
从临时表复制数据

DELETE FROM `#TABLE#`;

如果你不在乎你保留哪一排

INSERT INTO #TABLE# SELECT * FROM  `#TMP_TABLE#`
“忽略”很重要,这意味着以静默方式忽略重复数据。(ie在插入到表格的“新版本”时忽略它。)

可能要删除索引afterwoods

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

请阅读地址重复的位置,您希望在结果集中返回哪一行?第一行由ID?ID 2组成,看起来不与任何其他行重复。。为什么你也要删除它…Ian Nelson是对的吗???可能的重复项你确定一次查询不可能完成吗?检查我的答案,我是否遗漏了什么?@davideo,是的,这是可能的。你真是个天才。你的解决方案是完美的one@maulik.patel,您可以在更复杂的条件下使用上述逻辑如果我需要保持较低的id呢?只需更改
t1.id
by
t1.id>t2.id
ALTER IGNORE TABLE table ADD UNIQUE KEY 'address' (`address`);
ALTER TABLE table DROP KEY 'address';