PostgreSQL:在分页输出中使用row_number()

时间:2011-01-04 14:50:53

标签: php postgresql rank

我有一个PHP脚本,显示按“虚拟货币”排序的玩家列表:

$sth = $db->prepare("
select u.id,
        u.first_name,
        u.city,
        u.avatar,
        m.money,
        u.login > u.logout as online
from pref_users u, pref_money m where
        m.yw=to_char(current_timestamp, 'IYYY-IW') and
        u.id=m.id
order by m.money desc
limit 20 offset ?
");
$sth->execute(array($_GET['offset']));

要在列表中显示玩家位置,我使用PHP变量$ pos,它在循环中递增,同时打印其名称和更多数据。

由于各种原因,我希望在SQL语句中使用该位置而不是PHP。所以我正在尝试以下方法:

$sth = $db->prepare("
select u.id,
        row_number() + ? as pos,
        u.first_name,
        u.city,
        u.avatar,
        m.money,
        u.login > u.logout as online
from pref_users u, pref_money m where
        m.yw=to_char(current_timestamp, 'IYYY-IW') and
        u.id=m.id
order by m.money desc
limit 20 offset ?
");
$sth->execute(array($_GET['offset'], $_GET['offset']));

但是得到错误:窗口函数调用需要一个OVER子句

我正在尝试添加 over(m.money)但是语法错误。

我可能误解了Window Functions doc。

2 个答案:

答案 0 :(得分:1)

您需要row_number() OVER (ORDER BY m.money) + ?等。

答案 1 :(得分:1)

查看用户注释:http://www.postgresql.org/docs/8.4/interactive/functions-window.html

您需要Over()包含与整个查询相同的order by子句:

$sth = $db->prepare("
select u.id,
        row_number() OVER (order by m.money desc) + ? as pos,
        u.first_name,
        u.city,
        u.avatar,
        m.money,
        u.login > u.logout as online
from pref_users u, pref_money m where
        m.yw=to_char(current_timestamp, 'IYYY-IW') and
        u.id=m.id
order by m.money desc
limit 20 offset ?
");
$sth->execute(array($_GET['offset'], $_GET['offset']));