Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql sql语句太长?_Php_Mysql_Codeigniter - Fatal编程技术网

Php mysql sql语句太长?

Php mysql sql语句太长?,php,mysql,codeigniter,Php,Mysql,Codeigniter,背景信息 我有两个版本的逻辑应该是相同的。第一种是有效的,第二种是给出部分结果。 我有一个函数,它接收一个对象数组。每个对象都有一个object_id。对于数组中的每个对象,我想运行sql语句从数据库中获取更多数据 示例代码 在第一个示例中,我逐个循环遍历对象并执行SQL语句。我从1574条记录开始,得到1574条结果。然而,当我尝试使用所有ID生成一个字符串,然后将其传递到SQLIN命令中时,我只得到800个左右的结果。 下面是失败的部分代码:我没有剪切和粘贴代码。。。这里只包括关键部分 pu

背景信息 我有两个版本的逻辑应该是相同的。第一种是有效的,第二种是给出部分结果。 我有一个函数,它接收一个对象数组。每个对象都有一个object_id。对于数组中的每个对象,我想运行sql语句从数据库中获取更多数据

示例代码 在第一个示例中,我逐个循环遍历对象并执行SQL语句。我从1574条记录开始,得到1574条结果。然而,当我尝试使用所有ID生成一个字符串,然后将其传递到SQLIN命令中时,我只得到800个左右的结果。 下面是失败的部分代码:我没有剪切和粘贴代码。。。这里只包括关键部分

public function getwidgetdetails($widgets)
{
        foreach $widgets as $widget {
               if isset($widget['id']) {
                  $list_of_ids = $widget['id'] . ',' . $list_of_ids;
               }
        }
          //remove the trailing comma
          $list_of_ids = substr($list_of_ids, 0, -1);

          $temparray = explode(",", $list_of_ids);
          print('<BR>temp array count:'.count($temparray) . "<BR>"); // this correctly gives 1574

          $sql = "select * from object where object_id IN(". $list_of_ids. ")";
          $query = $this->db->query($sql);  
          $all_widget_data = $query->result_array();
          print(count($all_widget_data)); -- this gives 800 + records.
}
到目前为止我都试过了

有趣的是,当我试图通过命令行运行sql语句时,我无法在不切断它的情况下粘贴完整的sql语句。我不知道命令行缓冲区有多大

问题

我的sql语句是否可能太长? 我的另一个问题是,就sql而言,什么更有效? 为每个对象运行单独的sql语句是否更好?或者像我现在做的那样,试着合并成一个?
谢谢

我不太清楚为什么结果会被删除,可能是查询字符串太长了

你可以试试这样的东西;在哪里可以分块查询数据库

public function getwidgetdetails($widgets)
{
    // Init
    $results = array();

    // Parse Ids
    $list_of_ids = array();
    foreach ($widgets as $widget) {
        if isset($widget['id']) {
            $list_of_ids[] = $widget['id'];
        }
    }

    // Load Data In Chunk
    foreach (array_chunk($list_of_ids, 250) as $ids)
    {
        // Query Db
        $query = $this->db->query(sprintf("select * from object where object_id IN (%s)",
            implode(',', $ids)));

        // Append Result
        $results = array_merge($results, $query->result_array());
    }

    // Finished
    return $results;
}

退房。in子句中字符串的大小似乎受到mysql系统变量的限制。默认值似乎是4MB,如果需要,可以增加到1GB。

您的id是连续的吗?:

如果是这样,您可以尝试以下方法:

$sql = "select * from object where object_id BETWEEN $firstId AND $lastId";

有趣的我试试看。与为每个对象运行单独的sql语句相比,一次完成所有任务是否更有效?我想是这样的。。。这就是为什么我开始走这条路。不过我想再核实一下……谢谢。我以前不知道这件事。矿井目前设置为16M。。。所以我想我应该没事。