2016-07-19 118 views
2

我有

一个包含坏数据的用户表。 我想循环并删除email的重复记录,并保留有记录lowerid删除重复的记录,并保留一个较低的ID

enter image description here

我想只保留ID:1,14,1004,1005,1003,1006,1007和


我已经试过

$users = DB::table('users')->where('id', DB::raw("(select min(`id`) from users)"))->get(); 

foreach ($users as $user) { 
    if (????)) { // <---- I'm not sure what to put here. 
     $user->delete(); 
    } 
} 

我注意到了

$users = DB::table('users')->groupBy('email')->get();

返回我想保留的所有记录。


现在有点卡住,任何提示将非常感激

+0

什么是$电子邮件? –

+0

对不起,请忽略。我会把它拿下来,我正在试着玩弄数据。 – ihue

回答

4

尝试是这样的

// get users with min id 
$ids= DB::table('users')->where('id', DB::raw("(select min(`id`) from users)"))->lists('id'); 

// get all users 
$users = \App\User::all(); 

foreach ($users as $user) { 
    if (!in_array($user->id, $ids)) { 
     $user->delete(); 
    } 
} 

首先列出与最小内径为用户的所有ID(具有唯一的电子邮件) ,然后让所有用户通过它们循环。删除每个不在其中的用户。

UPDATE

由于上查询似乎没有在这里工作是我想尝试(没有最终veryfied)

DB::table('users')->select('id', DB::raw('min("id") as lowest_id, email'))->groupBy('email')->lists('id') 
+0

这将只返回一行。你需要'通过电子邮件群' – Peter

+0

@Peter:我得到了同样的结果'数组:1 [▼ 0 => 1 ]' – ihue

+0

@Frank:我们需要使用group by吗? – ihue

相关问题