【问题标题】:Delete duplicate rows from big table by column value按列值从大表中删除重复行
【发布时间】:2018-04-12 18:09:54
【问题描述】:

有大表(~1.6m 行),看起来像:

------------------------------------
| id |   text   | image_id | order |
------------------------------------
|  2 |  random  |    12    |   1   |
------------------------------------
|  3 |  random  |    12    |   2   |
------------------------------------
|  5 |  random  |    12    |   1   |
------------------------------------
|  6 |  random  |    12    |   2   |
------------------------------------
|  8 |  random  |    17    |   1   |
------------------------------------
|  9 |  random  |    17    |   1   |
------------------------------------

目标是:

------------------------------------
| id |   text   | image_id | order |
------------------------------------
|  2 |  random  |    12    |   1   |
------------------------------------
|  3 |  random  |    12    |   2   |
------------------------------------
|  8 |  random  |    17    |   1   |
------------------------------------

多行id不同但其他数据相同,所以每个订单号只需要保留一行(111222333444需要为1234)。

此查询适用于小表:

DELETE n1 FROM table n1, table n2 WHERE image_id = 12 AND n1.id > n2.id AND n1.order = n2.order

但是对于大表查询时间太长,所以接收超时。

数据库后端是 Laravel 和 PHP,我们使用块来查询这些表。

基本目标是根据 image_id 爬取大表并删除重复项,因此对于每个 image_id,我们得到的行的顺序列如下:1、3、4、5、6、7、8 等。

【问题讨论】:

  • 删除查询需要在 (image_id, id, order) 列上建立索引

标签: php mysql laravel


【解决方案1】:

只需使用 laravel 中的 unique() 方法

$uniqueData = Model::unique(function ($item) {
   return $item['image_id'].$item['order'];
});
$uniqueData->values()->all();
return $uniqueData;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多