PostgreSQL: использование row_number () в постраничном выводе - PullRequest
3 голосов
/ 04 января 2011

У меня есть 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) но получаю синтаксическую ошибку.

Возможно, я неправильно понимаю Функции окна doc.

Ответы [ 2 ]

1 голос
/ 05 января 2011

Проверьте пользовательские заметки на: http://www.postgresql.org/docs/8.4/interactive/functions-window.html

Вам понадобится Over (), чтобы содержать тот же порядок по выражению, что и весь запрос:

$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']));
1 голос
/ 04 января 2011

Вы хотите row_number() OVER (ORDER BY m.money) + ? и т. Д.

...