MySQL根据条件和多列组合删除重复项

时间:2016-11-24 11:58:14

标签: mysql database duplicates query-optimization

我在MySQL中有一个表格如下:

 https://www.google.com/maps/embed/v1/place?key=YOUR_API_KEY
  &q=place_id:YOUR_PLACE_ID

col1和col2之间的关系与位置无关,即col1中的OBJ1和col2中的OBJ2与col2中的OBJ1和col1中的OBJ2相同。这意味着OBJ1和OBJ2共享一种关系。 现在,这意味着对象OBJ1和OBJ2的值为1,5,3 ...... 我想只保留不同的值,即OBJ1,OBJ2应该只在表中出现一次,甚至不是OBJ2,OBJ1。 重要的是,我想只保留具有最高值的行。 我想要的结果是:

ID, COL1, COL2 VALUE
'1', 'OBJ1', 'OBJ2', '5'
'2', 'OBJ1', 'OBJ2', '1'
'3', 'OBJ2', 'OBJ1', '3'
'4', 'OBJ3', 'OBJ1', '4'
'5', 'OBJ3', 'OBJ4', '6'

这样做的最佳和有效方法是什么?我有超过1000万行。

我在很多论坛/谷歌搜索过但找不到我要找的确切答案..

3 个答案:

答案 0 :(得分:0)

试试这个:

{{1}}

答案 1 :(得分:0)

您可以使用in子句和按

分组的子选择

用于解决与不同对组合相关的问题 您应该以适当的方式组织数据

  select 
    id 
  , case when  col1 <= col2 then col1 else col2  end COL1
  , case when  col1 > col2 then col1 else col2 end COL2
  , value 
  from start_table 

然后查询变为

  SELECT t1.ID, t1.COL1, t1.COL2, t1.VALUE
  FROM (
    select 
      id 
    , case when  col1 <= col2 then col1 else col2  end COL1
    , case when  col1 > col2 then col1 else col2 end COL2
    , value 
    from start_table 
  )  t1
  where value in ( 
      select max(value) 
      FROM (
        select 
          id 
        , case when  col1 <= col2 then col1 else col2  end COL1
        , case when  col1 > col2 then col1 else col2 end COL2
        , value 
        from start_table 
      ) mytable 
      group by col1, col2
  )

或使用内部联接

SELECT t1.ID, t1.COL1, t1.COL2, t1.VALUE
FROM (
    select 
      id 
    , case when  col1 <= col2 then col1 else col2  end COL1
    , case when  col1 > col2 then col1 else col2 end COL2
    , value 
    from start_table 
  )  t1 
inner join 
  (
    select max(value)  as value
    FROM (
    select 
      id 
    , case when  col1 <= col2 then col1 else col2  end COL1
    , case when  col1 > col2 then col1 else col2 end COL2
    , value 
    from start_table 
  )  mytable 
    group by col1, col2
  ) T2 on t1.value = t2.value

答案 2 :(得分:0)

重建表格,以便不允许重复;在这个过程中,摆脱重复。 (并摆脱显然无用的id。)

CREATE TABLE new (
    col1 ...,
    col2 ...,
    `value` ...,
    PRIMARY KEY(col1, col2),
    INDEX(col2, col2, `value`)
) ENGINE=InnoDB;

INSERT INTO new (col1, col2, `value`)
    SELECT LEAST(col1, col2),
           GREATEST(col1, col2),
           `value`
    ON DUPLICATE KEY UPDATE
           `value` := GREATEST(`value`, VALUES(`value`));

RENAME TABLE real TO old,
             new TO real;

DROP TABLE old;

将来,您需要INSERTing / UPDATEing个新行:

INSERT INTO new (col1, col2, `value`)
    VALUES (?, ?, ?)
    ON DUPLICATE KEY UPDATE
           `value` := GREATEST(`value`, VALUES(`value`));

(假设您希望在表格中已经增加value。)

这些节省空间和速度(对于10M行很重要):摆脱id;具有最佳指标;使用InnoDB;等