Db2从范围中选择

时间:2011-06-22 06:54:42

标签: php pagination db2 range ibm-midrange

我被要求在我的工作中修复一个php函数。原型是:

function select($cols, $table, $cond, $order, $start, $max);

它使用odbc_exec()查询数据库,并返回odbc_num_rows()的行数。功能代码如下:

$this->query = "SELECT $cols FROM $table ";
if($cond) $this->query .= "WHERE $cond";
if($order) $this->query .= " ORDER BY ".$order;

此功能在很多地方使用,所以我无法从头开始编写。它从许多表中获取记录。直到昨天它还没有使用$ max变量,所以它正在读取数据库中的所有记录。他们正在使用iSeries Access ODBC驱动程序。我看了here的答案,但找不到。

我想使用$ start变量,从$ start开始读取并读取$ max行。如果$ start为100且$ max为50,我想获得100-150之间的记录。我昨天补充了这一部分:

if($max) $this->query .= " FETCH FIRST " . $max . " ROWS ONLY ";

我找不到任何对我的问题有用的东西。我知道我可以使用id或类似的东西为一张桌子做这件事。但我正在寻找一个通用的解决方案。

2 个答案:

答案 0 :(得分:0)

也许这会有所帮助:

SELECT DB2 LIMIT

答案 1 :(得分:0)

我解决了这个问题。

首先,您需要使用php将$ cols中的每个列名转换为$ table.columnName。

$this->query .= " ( SELECT ROW_NUMBER() OVER() AS rownum, $convertedColumns
                       FROM $table ) AS tmp WHERE rownum > ". $start ." " ;
if($max) {
    $last = $start + $max;
    $this->query .= " AND rownum <= ". $last . " ";
}

结果查询如下所示:

SELECT $cols FROM 
    ( SELECT ROW_NUMBER() OVER() AS rownum, $convertedCols ) AS tmp
WHERE rownum > $start AND rownum <= $max