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