SQLSTATE [42000]:语法错误或访问冲突
SQLSTATE [42000]: Syntax error or access violation
在不禁用MySQL的严格模式的情况下进行分组,如果我禁用严格模式,则以下查询有效,但是,我不想这样做,有人可以给我更好的建议,我一直在尝试好几种方法我都做不到
抛出的错误是:SQLSTATE [42000]: 语法错误或访问冲突:... up by digital_cards``id
) as aggregate_table
) '
$cards = DB::table('digital_cards')
->join('companies', 'digital_cards.company_id', '=', 'companies.id')
->join('profiles' , 'digital_cards.profile_id', '=', 'profiles.id')
->join('company_services', 'companies.id', '=', 'company_services.company_id')
->join('services', 'company_services.service_id', '=', 'services.id')
->where('services.service', 'LIKE', "%$keyword%")
->where('digital_cards.is_public', '=', 1)
->groupBy('digital_cards.id');
->orderBy('companies.name', 'ASC')
->paginate(10);
在得到一些帮助后我找到了解决方案。
首先。为什么会弹出错误?
弹出错误是因为当您分组时,您没有定义您希望如何选择连接的列。
假设您在加入 tables (t=table, c= column) 后拥有这些列:
t1.id | t1.c1 | t1.c2 | t2.c1 | t2.c2
1. | hello | car | alfa | one
2. | bye | bike | alfa | one
3. | hello | car | beta | two
假设我们要按 t1.c1
分组。 SQL 不知道您是否需要 alfa | one
或 beta | two
的值,因此它会抛出错误。
为什么 'strict' => false
解决了这个问题?
当您将 strict 设置为 false 时,sql 将自动选择一个默认规则来选取连接的列值,而不是抛出错误。
没有'strict' => false
如何解决问题?
使用 MIN
或 MAX
(或任何其他规则)。
我不知道你加入的 table 有哪些列,所以这是我的代码的简化版本:
$data = Payment::
leftJoin('videos', 'videos.id', '=', 'payments.video_id')
->selectRaw('
// payment columns
min(videos.stream_start) stream_start,
min(videos.keep_archive) keep_archive
')
->whereIn('payments.video_id', $videos)
->groupBy('year', 'month')
->orderBy('year', 'desc')
->get();
如您所见,我只从连接的 table 中选择两列,所以我只需要在这两列上写 min(column)
,即使 'strict' => true
错误也会消失(我不确定您是否还需要第一个 table 的规则)。
在不禁用MySQL的严格模式的情况下进行分组,如果我禁用严格模式,则以下查询有效,但是,我不想这样做,有人可以给我更好的建议,我一直在尝试好几种方法我都做不到
抛出的错误是:SQLSTATE [42000]: 语法错误或访问冲突:... up by digital_cards``id
) as aggregate_table
) '
$cards = DB::table('digital_cards')
->join('companies', 'digital_cards.company_id', '=', 'companies.id')
->join('profiles' , 'digital_cards.profile_id', '=', 'profiles.id')
->join('company_services', 'companies.id', '=', 'company_services.company_id')
->join('services', 'company_services.service_id', '=', 'services.id')
->where('services.service', 'LIKE', "%$keyword%")
->where('digital_cards.is_public', '=', 1)
->groupBy('digital_cards.id');
->orderBy('companies.name', 'ASC')
->paginate(10);
在得到一些帮助后我找到了解决方案。
首先。为什么会弹出错误?
弹出错误是因为当您分组时,您没有定义您希望如何选择连接的列。
假设您在加入 tables (t=table, c= column) 后拥有这些列:
t1.id | t1.c1 | t1.c2 | t2.c1 | t2.c2
1. | hello | car | alfa | one
2. | bye | bike | alfa | one
3. | hello | car | beta | two
假设我们要按 t1.c1
分组。 SQL 不知道您是否需要 alfa | one
或 beta | two
的值,因此它会抛出错误。
为什么 'strict' => false
解决了这个问题?
当您将 strict 设置为 false 时,sql 将自动选择一个默认规则来选取连接的列值,而不是抛出错误。
没有'strict' => false
如何解决问题?
使用 MIN
或 MAX
(或任何其他规则)。
我不知道你加入的 table 有哪些列,所以这是我的代码的简化版本:
$data = Payment::
leftJoin('videos', 'videos.id', '=', 'payments.video_id')
->selectRaw('
// payment columns
min(videos.stream_start) stream_start,
min(videos.keep_archive) keep_archive
')
->whereIn('payments.video_id', $videos)
->groupBy('year', 'month')
->orderBy('year', 'desc')
->get();
如您所见,我只从连接的 table 中选择两列,所以我只需要在这两列上写 min(column)
,即使 'strict' => true
错误也会消失(我不确定您是否还需要第一个 table 的规则)。