2015-10-13 25 views
1

我期待從我的表中返回有關重複記錄的完整信息。使用Laravel的查詢構建器返回完整的重複行

我目前使用下列內容:

DB::table($entity['table']) 
       ->select('*') 
       ->groupBy($entity['columns']) 
       ->havingRaw('COUNT(*) > 1') 
       ->get(); 

這是偉大的,它返回重複的記錄,然而,這只是回報我需要返回所有的重複,這樣我可以迎接一個記錄用戶可以選擇刪除或保留哪一個。

如何修改上述查詢來完成該操作?

+0

'$ ['columns']'的內容是什麼?這是一個字符串還是數組? – Jerodev

+0

目前它是一個數組,但只是一個元素,只是試圖讓它工作,我現在需要的東西:) – ChrisBratherton

回答

1

加入對同一個表可以讓你無需剛開的這一個版本檢索重複記錄(在你的問題由您GROUPBY )

$entity['columns'] = ['username', 'surname']; 

$groupBy = implode(',', $entity['columns']); 

$subQuery = DB::table('list') 
    ->select('*') 
    ->groupBy($groupBy) 
    ->havingRaw('(count(id) > 1))'); 

$result = DB::table('list') 
    ->select('*') 
    ->join(
     DB::raw("({$subQuery->toSql()}) dup"), function($join) use ($entity) { 
      foreach ($entity['columns'] as $column) { 
       $join->on('list.'.$column, '=', 'dup.'.$column); 
      } 
     }) 
    ->toSql(); 
    // or ->get(); obviously 

    dd($result); 
+0

完美!感謝:) – ChrisBratherton

+0

這似乎從查詢中返回多個副本 – ChrisBratherton

+0

您是否有樣本數據集? –

0

您需要連接到$ entity ['columns']中列的$ entity ['table']中的表以獲取重複項。

此外,即使您使用mysql,select('*')也不是一個好主意。這是違反SQL標準,只有在以某種方式配置的情況下才能在mysql中工作。如果配置更改或者您將應用程序遷移到具有不同配置的mysql服務器上,那麼您的查詢將失敗。

我會在選擇列表中使用$ entity ['columns']。

在SQL查詢應該像下面這樣:

select table.* from table inner join 
    (select field1, field2 from table t 
    group by field1, field2 
    having count(*)>1) t1 
on table.field1=t1.field1 and table.field2=t1.field2 
+0

感謝您的幫助,這將工作,我可以看到這裏發生了什麼,但我的問題是旨在更多地如何在Laravel查詢構建器中執行此操作?有任何想法嗎? – ChrisBratherton

+0

有關如何在Laravel中構建子查詢的很多主題,請參閱以下示例:http://stackoverflow.com/questions/28319240/laravel-how-to-use-derived-tables-subqueries-in-the-laravel-查詢生成器 – Shadow