Ich habe hier ein Beispiel, vielleicht hilft das ja weiter:
Code:
/**
* Build LIMIT query
*/
function _sql_query_limit($query, $total, $offset = 1, $max_records = 0, $cache_ttl = 0)
{
$this->query_result = false;
// if $total is set to 0 we do not want to limit the number of rows
if ($total == 0)
{
// Having a value of -1 was always a bug
$total = '18446744073709551615';
}
if ($max_records == 0)
{
// Having a value of -1 was always a bug
$max_records = '18446744073709551615';
}
$end_offset = $offset + $total - 1;
if ( $end_offset > $max_records )
{
$diff = $end_offset - $max_records;
$end_offset = $end_offset - $diff;
$total = $total - $diff;
}
// DB2 UDB for iSeries (V5R4)
$search_string = 'ORDER BY';
$sort_order = 'ASC';
$sort_order_desc = 'DESC';
$reverse_order = '';
$order_query = '';
$h_query = strtoupper($query);
if ( stripos($h_query, $search_string) !== false )
{
$pos = stripos($h_query, $search_string);
$order_query = stristr($h_query, $search_string);
$order_found = false;
if ( stripos($order_query, $sort_order) !== false )
{
$reverse_order = 'DESC';
$order_found = true;
}
if ( stripos($order_query, $sort_order_desc) !== false and !$order_found )
{
$reverse_order = 'ASC';
$order_found = true;
}
if ( !$order_found )
{
$reverse_order = 'DESC';
}
}
else
{
$reverse_order = 'DESC';
}
$query = 'With UR as (' . $query . ' FETCH First ' . $end_offset . ' Rows Only),
SR as (SELECT * FROM UR ' . $order_query . ' ' . $reverse_order . ' FETCH First ' . $total . ' Rows Only)
SELECT * FROM SR ' . $order_query;
return $this->sql_query($query, $cache_ttl);
}
Man muss vorher nur ermitteln wie viele Datensätze insgesamt in der Abfrage zurück geliefert werden. Ein Schwachpunkt hat die Abfrage noch (bin leider noch nicht dazu gekommen das zu fixen), nämlich es darf beim ORDER BY nur ein Feld angegeben werden.
EDIT: Bei Join Abfragen muss man die Felder eindeutig mit dem AS-Clause im Select definieren (t.PRICE as PRICE).
Bookmarks