PHP mySQL - 将多个查询合并为1

时间:2013-09-24 09:46:26

标签: php mysql

这是我的问题:

我有一个包含3列的mySQL数据库(为了简单起见 - 还有其他不相关的列)和3000行数据(再次为了简单起见),我正在执行下面的循环:

$iCount = count($item_ids);
for($i=0;$i<$iCount;$i++){
    $q="SELECT item_id, value_date FROM $dataTable WHERE value_date >= $sDate AND value_date <= $eDate AND price_disc <> 'NA' AND item_id = '".$item_ids[$i]."' ORDER BY value_date";
    $q=$myConn->query($q);
    if($q->num_rows>0){
        $x=0;
        while($row=$q->fetch_assoc()){
            $iData[$i][0]=$row['item_id'];
            $iData[$i][1][$x]=$row['value_date'];
            $x++;
        }
        $q->free();
    }
    set_time_limit(30);
}

填充PHP数组(如您所见)。

上面的代码正在运行,虽然非常缓慢,因为它目前迭代大约3000次(每个item_id一个)。

我正在寻找一种方法,以与目前相同的格式将数据收集到一个数组中(item_id为数组[$ i] [0],value_date为数组[$ i] [1] [ $ x]),但在一个查询而不是3000。

注意:除非完全必要,否则我不想重新组织数据库。

我确信有一种简单的方法可以做到这一点。提前谢谢。

编辑:我知道我可以使用IN('。join(item_ids)。')将它组成一个查询字符串,我只是不知道如何将结果放在一个具有相同尺寸的数组中我所描述的一个。

2 个答案:

答案 0 :(得分:2)

使用IN

$ids = " ('" . implode(item_ids, "','") . "')" ;

$q ="SELECT item_id, value_date ";
$q.=" FROM $dataTable ";
$q.=" WHERE value_date >= $sDate AND value_date <= $eDate AND price_disc <> 'NA' ";
$q.=" AND item_id IN ".$ids ." ORDER BY value_date";
$stmt=$myConn->query($q);
if($stmt->num_rows>0){
    $x=0;
    $i=0;
    while($row=$stmt->fetch_assoc()){
        $iData[$i][0]=$row['item_id'];
        $iData[$i++][1][$x]=$row['value_date'];
        $x++;
    }
    $stmt->free();
}

如果您的请求仍然很慢,则必须在列上创建索引。

CREATE INDEX idx_item_id  ON YOUR_TABLE(item_id);

答案 1 :(得分:1)

你在一个简单的页面请求中做了3000次查询......太多了

将所有商品ID存储到数组中

$stringItemIds = implode(',',$arrayItemsId);

$q="SELECT item_id, value_date FROM $dataTable WHERE value_date >= $sDate AND value_date <= $eDate AND price_disc <> 'NA' AND item_id IN ($stringItemIds) ORDER BY value_date";

之后使用查询进行迭代:

    $q=$myConn->query($q);
    if($q->num_rows>0){
        $x=0;
        while($row=$q->fetch_assoc()){
            $iData[] = array(
                '0' => $row['item_id'],
                '1' => array('x' => $row['value_date'])
            );
        }
        $q->free();
    }