这可能很容易,但不知道如何。
我有一个表可以具有特定非键列字段的重复值。如何使用查询生成器或Eloquent编写SQL查询,该查询将获取具有该列的不同值的行?
请注意,我不是仅提取该列,而是与其他列值一起使用,因此distinct()
可能无效。那么问题基本上就是如何在distinct()
不接受参数的情况下指定我想在查询中区分的列?
答案 0 :(得分:83)
您应该使用groupby
。在Query Builder中,您可以这样做:
$users = DB::table('users')
->select('id','name', 'email')
->groupBy('name')
->get();
答案 1 :(得分:47)
在Eloquent中你也可以这样查询:
$users = User::select('name')->distinct()->get();
答案 2 :(得分:22)
在雄辩中你可以使用这个
$users = User::select('name')->groupBy('name')->get()->toArray() ;
groupBy实际上是获取不同的值,实际上groupBy会对相同的值进行分类,以便我们可以对它们使用聚合函数。但在这种情况下,我们没有聚合函数,我们只是选择将导致结果具有不同值的值
答案 3 :(得分:11)
虽然我迟到了回答这个问题,但使用Eloquent获取不同记录的更好方法是
$user_names = User::distinct()->get(['name']);
答案 4 :(得分:5)
请注意,上面使用的groupBy
不适用于postgres。
使用distinct
可能是更好的选择 - 例如
$users = User::query()->distinct()->get();
如果您使用query
,则可以按要求选择所有列。
答案 5 :(得分:4)
如果数据库规则不允许任何选择字段超出聚合函数,则分组将不起作用。而是使用laravel collections。
$users = DB::table('users')
->select('id','name', 'email')
->get();
foreach($users->unique('name') as $user){
//....
}
答案 6 :(得分:3)
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
检索表中不同行的所有三个同语。您可以根据需要添加任意数量的列。
答案 7 :(得分:1)
我发现此方法(对我而言)非常有效,可以生成唯一值的平面数组:
$uniqueNames = User::select('name')->distinct()->pluck('name')->toArray();
如果您在此查询构建器上运行->toSql()
,将会看到它生成如下查询:
select distinct `name` from `users`
->pluck()
由illuminate \ collection lib处理(不是通过sql查询)。
答案 8 :(得分:1)
在尝试填充用户与其他用户所拥有的所有唯一线程的列表时,我遇到了相同的问题。这对我来说很成功
Message::where('from_user', $user->id)
->select(['from_user', 'to_user'])
->selectRaw('MAX(created_at) AS last_date')
->groupBy(['from_user', 'to_user'])
->orderBy('last_date', 'DESC')
->get()
答案 9 :(得分:0)
$users = Users::all()->unique('name');
答案 10 :(得分:0)
**
**
由于要从表中获取所有列,因此可以收集所有数据,然后使用名为Unique的Collections函数对其进行过滤
// Get all users with unique name
User::all()->unique('name')
或
// Get all & latest users with unique name
User::latest()->get()->unique('name')
有关更多信息,您可以检查Laravel Collection Documentations
答案 11 :(得分:0)
对于那些喜欢我的人犯同样的错误。这是精心设计的答案 在Laravel 5.7中测试
UserFile :: orderBy('created_at','desc')-> get()-> toArray();
Array
(
[0] => Array
(
[id] => 2073
[type] => 'DL'
[url] => 'https://i.picsum.photos/12/884/200/300.jpg'
[created_at] => 2020-08-05 17:16:48
[updated_at] => 2020-08-06 18:08:38
)
[1] => Array
(
[id] => 2074
[type] => 'PROFILE'
[url] => 'https://i.picsum.photos/13/884/200/300.jpg'
[created_at] => 2020-08-05 17:20:06
[updated_at] => 2020-08-06 18:08:38
)
[2] => Array
(
[id] => 2076
[type] => 'PROFILE'
[url] => 'https://i.picsum.photos/13/884/200/300.jpg'
[created_at] => 2020-08-05 17:22:01
[updated_at] => 2020-08-06 18:08:38
)
[3] => Array
(
[id] => 2086
[type] => 'PROFILE'
[url] => 'https://i.picsum.photos/13/884/200/300.jpg'
[created_at] => 2020-08-05 19:22:41
[updated_at] => 2020-08-06 18:08:38
)
)
UserFile :: select('type','url','updated_at)-> distinct('type')-> get()-> toArray();
Array
(
[0] => Array
(
[type] => 'DL'
[url] => 'https://i.picsum.photos/12/884/200/300.jpg'
[updated_at] => 2020-08-06 18:08:38
)
[1] => Array
(
[type] => 'PROFILE'
[url] => 'https://i.picsum.photos/13/884/200/300.jpg'
[updated_at] => 2020-08-06 18:08:38
)
)
因此,仅传递"select()"
中那些值相同的列。
例如:'type','url'
。您可以添加更多具有相同值的列,例如'updated_at'
。
如果您尝试通过"created_at"
中的"id"
或"select()"
,则将获得与A相同的记录。
因为数据库中的每一行都不同。
答案 12 :(得分:0)
// Get unique value for table 'add_new_videos' column name 'project_id'
$project_id = DB::table('add_new_videos')->distinct()->get(['project_id']);
答案 13 :(得分:-1)
$users = User::all();
foreach($users->unique('column_name') as $user){
code here..
}