我有一个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。
答案 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']));