从mysql表中删除特定列值的重复行

时间:2015-02-13 12:52:52

标签: mysql sql select duplicates sql-delete

我有一个'命令'这样的表结构包含100,000条记录:

date           orderid   type      productsales  other
01-Aug-2014    11        order     118           10.12    
01-Aug-2014    11        order     118           10.12
18-Aug-2014    11        order     35            4.21
22-Aug-2014    11        Refund    -35           -4.21
09-Sep-2014    12        order     56            7.29
15-Sep-2014    12        refund    -56           -7.29
23-Oct-2014    13        order     25            2.32
26-Oct-2014    13        refund    -25           -2.32

现在,我想要实现的是从我的表中删除那些重复行,其中orderid,type,productsales和其他列值彼此相同并且只保留一行(查看orderid的前两个记录11)。

但如果' orderids'对于相同'类型的两个记录是相同的'订单,但' productsales'和其他'列值不同,然后不删除这些行。我希望我澄清了我的观点。

我正在寻找一个mysql删除查询来执行此任务。

5 个答案:

答案 0 :(得分:1)

您应该添加一个id列。如果你不想使用临时表,你可能会做这样的事情(我没有测试过,所以......):

ALTER TABLE 'orders'
ADD COLUMN 'id' INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY Id(id)

DELETE 
FROM orders INNER JOIN 
(
   SELECT TOP 1 id
   FROM orders
   WHERE COUNT(DISTINCT date,orderid,type.productsales,other) > 1
) dupes
ON orders.id = dupes.id

答案 1 :(得分:1)

可能是它的重复问题:MySql: remove table rows depending on column duplicate values?

你可以在那里寻找答案。

此处的解决方案指出,使用unique index关键字在可能的重复列上添加IGNORE将删除所有重复行。

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`col1`, `col2`, `col3`);

在此我还想提一些观点:

  1. 如果任何列(来自索引,如此处为3列)具有null作为值,则唯一索引不会在行中进行更改。例如:null,1,"asdsa"可以存储两次
  2. 如果您在唯一索引中有单个列,那么具有null值(对于该列)的多个行将保留在表中
  3. IGNORE关键字ID 已弃用现在,它在MySQL 5.6之后无法运行(可能)。现在唯一的选择是通过如下查询创建新表:
  4. CREATE TABLE <table_name> AS SELECT * FROM <your_table> GROUP BY col1,col2,col3;

    之后,您可以删除<your_table>并将<table_name>重命名为您的表格。

    在这里,您可以根据需要更改Group By子句中的列列表(从所有列到一列,或者一些列具有重复值的列)。

    加分是,它也可以使用空值。

答案 2 :(得分:0)

一种非常简单的方法是在3列上添加UNIQUE索引。编写ALTER语句时,请包含IGNORE关键字。像这样:

ALTER IGNORE TABLE orders ADD UNIQUE INDEX idx_name (orderid, type, productsales, other);

这将删除所有重复的行。作为一个额外的好处,未来的重复INSERT将会出错。与往常一样,您可能希望在运行此类内容之前进行备份...

我希望这可以帮到你。

答案 3 :(得分:0)

试试这个。 创建temp表,例如temp和存储的唯一数据,

SELECT distinct * into temp FROM Orders

然后将订单表的记录删除为

 DELETE FROM orders

删除所有记录后,将记录temp插入记录。

INSER into RECORDS SELECT * FROM TEMP DROP TABLE TEMP 

答案 4 :(得分:0)

如果你有完全重复的行,并且你想在SQL中执行此操作,那么最好的方法可能是将所需的行保存在临时表中,截断表,然后将数据插回:

create temporary table temp_orders as
    select distinct *
    from orders;

truncate table orders;

alter table orders add orderid int not null primary key auto_increment;

insert into orders;
    select *
    from temp_orders;

哦,看,我还添加了一个自动递增的主键,以便您将来不会遇到此问题。如果每行都有一个唯一的键,这将是一个更简单的过程。

相关问题