【问题标题】:1390 Prepared statement contains too many placeholders using Laravel 5.61390 使用 Laravel 5.6 准备的语句包含太多占位符
【发布时间】:2019-03-18 23:43:18
【问题描述】:

出现以下错误

SQLSTATE[HY000]: 一般错误:1390 Prepared statement contains too many placeholder

我的查询变成了最近表格中的数据

SELECT
  *
FROM
  table
WHERE col1 = 'some-val'
  AND col2 NOT IN ('va1', 'val2', 80k values... )

我使用的是 Laravel 5.6

$data_will_be_skipped = OtherModel::select('code')
        ->where('col1', 0)
        ->orWhere('col2', 1)
        ->groupBy('col3')
        ->pluck('col3')->toArray();

$data_will_be_skipped 现在大约是 80k 个数组

Model::where('col1', 'some-val')->whereNotIn('col2', $data_will_be_skipped)->get();

【问题讨论】:

  • 您从哪里获得 not in 数组的值?如果它们仅来自数据库中的某些表。考虑使用连接而不是not in。无论是否使用 laravel,not in 本身都有数据包大小限制
  • 从索引的角度来看,您当前的方法也效率不高
  • 是的,数据库中的其他表正在获取未包含的值。
  • 请更新您的问题以添加有关您从哪些表中获取它们的更多详细信息。两张表有什么关系?从另一个表中获取这些值背后的逻辑是什么?

标签: mysql laravel eloquent


【解决方案1】:

MySQL 在准备好的语句中限制为 65,535 个参数。

改用子查询:

$data_will_be_skipped = OtherModel::select('col3')
    ->where('col1', 0)
    ->orWhere('col2', 1);
Model::where('col1', 'some-val')
    ->whereNotIn('col2', $data_will_be_skipped)
    ->get();

【讨论】:

  • 太棒了 :-) 你是冠军!
  • 当然,我只是接受,我必须参加会议。
  • 我仍然收到错误:SQLSTATE[HY000]: 一般错误:1390 Prepared statement contains too many placeholders (SQL: select callDate, uniqueid from cdr where uniqueid not in (1594624402.0,1594624402.4,1594624425.18,1594624425.22,1594624425.32,1594624448.52,1594624578.78,1594624578.82,1594624620.111,1594624620.115,1594624620.119,1594627078.156 ..........................
  • @JaberAlNahian - 我遇到了同样的问题。你找到解决方案了吗?
  • @Tom 我忘了,也许我必须增加限制
【解决方案2】:

无论你在数组中有多少项要签入

简单的方法

$data = model::whereRaw("id not in (".implode(',',$data_will_be_skipped).")")->get();

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2016-12-23
    • 2015-02-12
    相关资源
    最近更新 更多