我想在同一查询中使用groupby来获取结果。
我已经尝试过:
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();
但是我收到了此错误消息:
sqlstate [42000]:语法错误或访问违规:1055'sbrtpt.loading.id''不在组中(sql:sef:select *从加载中select *从(14、15、16)组中的ID中的ID中的ID,walle_no)
简短答案
在configdatabase.php
中 -> "mysql"
数组
将'strict' => false
设置为禁用全部。
....或
您可以离开'strict' => true
并将模式添加到
"mysql"
选项 'mysql' => [
...
....
'strict' => true,
'modes' => [
//'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION'
],
]
详细答案
您可能不需要禁用所有严格选项...请查看有关此问题的答案。
这可能是一个SQL_MODE问题。在您的config/database.php
中,在连接中,更改
strict => false
如
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
无需更改系统中的任何地方使用laravel中的代码
中的代码DB::statement("SET SQL_MODE=''");//this is the trick use it just before your query
$data=Task::where('user_id', Auth::user()->id)->where('status', 0)->groupBy('task_code')->get(['id','task_code', 'title']);
而无需修改configdatabase.php
文件
在configdatabase.php
中设置'strict' => false
可以是安全问题。因此,一个简单的Laravel解决方案可以是第一个调用get()
,然后 groupBy('vehicle_no)
:
$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
您可以离开'strict' => true
并将模式添加到" mysql"选项in。
'mysql' => [
...
....
'strict' => true,
'modes' => [
//'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
// 'NO_AUTO_CREATE_USER', // This has been deprecated and will throw an error in mysql v8
'NO_ENGINE_SUBSTITUTION'
],
]
更新config/database.php
set:
'mysql' => [
'strict' => false,
],
而不是:
'mysql' => [
'strict' => true,
],
,不要忘记清除缓存:
php artisan config:cache
每当在雄辩中使用groupby时,始终包含select()函数中的groupby函数中使用的列名。
$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
在配置文件中禁用严格模式是一种不良习惯。这样做可能会导致损坏的数据进入数据库,例如无效的日期,没有任何警告。除非绝对必要。
我也遇到了这个问题,但是将'strict' => true
更改为 'strict' => false
后,错误消失了。
您可以在:
中找到此设置config database.php
'mysql' => [
...
'strict' => false,
...
]
SQLSTATE[42000]: Syntax error or access violation: 1055 in GROUP BY
如果收到上述错误,请在config
文件夹中的database.php
文件中添加以下内容:
'mysql' => [
'strict' => true,
'modes' => [
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION'
],
]
稍后,在谷歌搜索一段时间后,我了解到问题是由sql_mode
设置引起的,并修改了 config/database.php 的配置为strict => false
。
请参阅:https://stdworkflow.com/147/laravel-syntax-error-eror-ccess-violation-1055-error
此限制是有道理的,就像您在mySQL中使用GROUP BY
时,它在GROUP BY
中使用的列中为每个值返回一行。因此,所选行中其他列的值在任何地方都没有意义。因此,总是建议使用最佳实践,我建议不要禁用MySQL严格模式。
通常,开发人员可能需要按列值分组的查询行。在这里,他们不需要一行根据列的唯一值。但是他们需要由特定列的唯一值分组的多行。由于某种原因,他们使用 groupBy
查询构建器的Laravel方法,该方法生成MySQL GROUP BY
查询,而开发人员会遇到上述错误。
解决他们问题的解决方案是使用groupBy
收集方法。例如,
$loadingData = DB::table('loading')
->whereIn('id', $loadIds)
->get()
->groupBy('vehicle_no');
这将为他们带来理想的结果。
您也可以使用:
独特('warter_no')
而不是groupby('warter_no')每个情况方案都不同,但是查看您的查询可能是因为您没有汇总数据,这可能是要走的方式。
这在laravel doc 8.x上,效果很好
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
将Schema::defaultStringLength(191);
添加到boot
方法
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191);
}
}
我解决了与使用组的使用相似的问题,首先要进行排序,然后使用组。
$SampleData= DB::table('tableExampleName')->get(['col1','col2'])->groupBy('col3');
然后您可以dd()值,并检查它们是否是正确的分组。您都可以将其分配并将其传递到您的视图中以进行进一步测试。
NOTE :这是使用 Laravel 8 。