我想在同一查询中使用WhereIn和Groupby来获取结果。
我试过这个:
import random
my_list = []
for i in range(100):
my_list.append(random.randint(0,1000))
def my_max(my_list):
#sort list from least to greatest
my_list.sort()
#get last item in list (max value)
my_max = my_list.pop()
return my_max
print my_max(my_list)
但我收到此错误消息:
SQLSTATE [42000]:语法错误或访问冲突:1055'sbrtpt.loading.id'不在GROUP BY中(SQL:select * from loading其中id为(14,15,16)group by vehicle_no)< / p>
答案 0 :(得分:97)
这可能是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,
],
答案 1 :(得分:86)
在config\database.php
- &gt; "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'
],
]
您可能不需要停用所有严格选项... 请关注此问题answer。
答案 2 :(得分:8)
无需更改系统中的任何位置,只需使用 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']);
答案 3 :(得分:4)
我也遇到了这个问题,但在将'strict' => true
更改为'strict' => false
后,错误消失了。
您可以在以下位置找到此设置:
<强>设置\ database.php中强>
'mysql' => [
...
'strict' => false,
...
]
答案 4 :(得分:3)
更新config/database.php
设置:
'mysql' => [
'strict' => false,
],
代替:
'mysql' => [
'strict' => true,
],
并且不要忘记清除缓存:
php artisan config:cache
答案 5 :(得分:2)
每当雄辩地使用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')
在配置文件中禁用严格模式也是一种不好的做法。这样做可能会导致损坏的数据进入数据库,例如无效的日期而没有任何警告。除非绝对必要,否则请不要这样做。
答案 6 :(得分:2)
此限制是合理的,因为当您在MySQL中使用GROUP BY
时,它将为GROUP BY
中使用的列中的每个值返回一行。因此,所选行中其他列的值在任何地方都没有意义。因此,始终建议使用最佳实践,而我建议不要禁用MySQL Strict Mode。
通常,开发人员可能需要按列值分组的查询行。在这里,它们不需要为每一列的唯一值仅需要一行。但是它们需要按特定列的唯一值分组的多行。由于某种原因,他们使用Laravel的groupBy
查询生成器方法,该方法生成MySQL GROUP BY
查询,并且开发人员遇到上述错误。
解决他们问题的方法是改用groupBy
收集方法。例如,
$loadingData = DB::table('loading')
->whereIn('id', $loadIds)
->get()
->groupBy('vehicle_no');
这将为他们提供所需的结果。
答案 7 :(得分:1)
'strict' => false
中设置 设置config\database.php
可能是安全问题。因此,一个简单的Laravel解决方案可以是首先调用get()
,然后依次调用groupBy('vehicle_no)
:
$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
答案 8 :(得分:1)
这是在 laravel doc 8.x 上,它运行良好
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
答案 9 :(得分:0)
您最好使用:
distinct('vehicle_no')
每种情况都与groupBy('vehicle_no')不同,但是从查询的角度来看,由于您不汇总数据,因此可能会采取与众不同的方式。
答案 10 :(得分:0)
您可以保留 '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', // This has been deprecated and will throw an error in mysql v8
'NO_ENGINE_SUBSTITUTION'
],
]
答案 11 :(得分:0)
SQLSTATE[42000]: Syntax error or access violation: 1055 in GROUP BY
如果出现上述错误,请将以下内容添加到 database.php
文件夹中的 config
文件中:
'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'
],
]
答案 12 :(得分:-1)
将\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);
}
}