按列值从大表中删除重复的行

时间:2018-04-12 18:09:54

标签: php mysql laravel

得到大表(~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

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

DB Backend是Laravel& PHP,我们使用块来查询这些表。

基本上目标是基于image_id抓取大表并删除重复项,因此对于每个image_id,我们获得了具有以下订单列的行:1,3,4,5,6,7,8等。

1 个答案:

答案 0 :(得分:0)

只需使用laravel

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