【问题标题】:Retrieve all duplicate data and delete unduplicated data Laravel检索所有重复数据并删除不重复数据 Laravel
【发布时间】:2022-01-13 09:13:09
【问题描述】:

我有下表,例如

|----|-------------|-----|-----|--------------------|
| id |address      | log | lat | timestamp          |
|----|-------------|-----|-----|--------------------|
| 1  | New York    |14.20|0.22 |2019-10-21 14:00:01 |
| 2  | New York    |14.20|0.22 |2019-10-21 14:00:01 |
| 3  | New York    |14.20|0.22 |2019-10-21 14:00:01 |
| 4  | Italy       |10.36|0.75 |2019-10-21 14:00:01 |
| 5  | Spain       |10.36|0.75 |2019-10-21 14:00:01 |
| 6  | London      |10.36|0.75 |2019-10-21 14:00:01 |
|----|-------------|-----|-----|--------------------|

对于选择一个,我想要一个只有重复数据的数据数组。 也就是说,id 1 纽约及其数据、id 2 纽约及其数据、id 3 纽约及其数据以及意大利、马德里和伦敦的其他地区应该被删除,因为它们不是重复的 如果一个项目出现多次,则重复

我试过了

Address::groupBy('address')->having(DB::raw('count(*)'), ">", "1")->select('address')->get();

但是我所有的地址都被占用了 如何将我的重复项放回数组中?

【问题讨论】:

  • 如果你想要一条记录然后使用group_by,你可以添加有问题的预期输出。
  • 为什么不使用 laravel distinct() 选择不同的值,然后使用这些 id 批量删除它们?
  • 我不知道要使用 distinct
  • distinct 不起作用。它仍将包括重复的行之一(结果集的 ID 为 1、4、5、6)。 groupby / 拥有是要走的路

标签: php mysql laravel


【解决方案1】:
--returns rows with ids 4, 5, 6
SELECT id, address, COUNT(address)
FROM addresses
GROUP BY (address)
HAVING COUNT(address) = 1 --unduplicated only
ORDER BY id

此查询应为您提供所有不重复的地址及其 id 和地址。

--returns rows with ids 1
SELECT id, address, COUNT(address)
FROM addresses
GROUP BY (address)
HAVING COUNT(address) > 1 --duplicated only
ORDER BY id

此查询应为您提供所有重复地址及其 id 和地址。

// first query using the query builder
$unduplicated = Address::query()
    ->select('id', 'address')
    ->selectRaw('count(address) as count')
    ->groupBy('address')
    ->havingRaw('count(address) = 1')
    ->get();

现在,要删除所有不重复的记录,有两个主要选项:

选项 1:批量删除。不会调用雄辩的事件

Address::query()->whereIn('id', $unduplicated->pluck('id'))->delete();

方案二:一一删除。调用雄辩的事件。

这可以通过很多不同的方式实现:

// using a Closure
$unduplicated->each(function ($address) {
    $address->delete();
});
// using a Short Closure
$unduplicated->each(fn($address) => $address->delete());
// using a high order collection
$unduplicated->each->delete();
// using model's static destroy method
Address::destroy($unduplicated->pluck('id'));

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2020-06-11
    • 2012-05-29
    • 2019-06-10
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多