2011-01-04 9 views
3

Ich habe einen PHP-Skript, um eine Liste der Spieler sortierte nach ihren „virtuellen Geld“ Anzeigen:PostgreSQL: mit row_number() in ausgelagerten Ausgang

$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'])); 

Um zu zeigen, eine Spielerposition in der Liste ich einen PHP-Variable verwenden $ pos, die beim Ausdrucken ihrer Namen und weiterer Daten in einer Schleife inkrementiert wird.

Ich möchte diese Position in der SQL-Anweisung anstelle von PHP aus verschiedenen Gründen haben. Also ich versuche folgendes:

$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'])); 

Aber bekommen die ERROR: Fenster Funktionsaufruf erfordert eine OVER-Klausel

Ich versuche über (m.money) hinzufügen, aber bekommen ein Syntax-Fehler.

Ich bin wahrscheinlich Missverständnis der Window Functions doc.

+0

Was ist "ein Syntaxfehler"? Und welche Syntax hast du versucht? Sie müssen OVER und eine ORDER BY verwenden, zeigen Sie uns, was Sie getan haben. OVER (ORDER BY m.money ASC) –

+1

@nate c: Es ist eine vorbereitete Anweisung in PHP, ich denke nicht, dass SQL-Injection ein Problem sein wird. –

Antwort

1

Überprüfen Sie die Benutzerhinweise auf: http://www.postgresql.org/docs/8.4/interactive/functions-window.html

Sie das Over() müssen die gleiche Reihenfolge von Klausel wie die gesamte Abfrage enthalten:

$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'])); 
+0

Danke, ich wusste nicht über die Bestellung –

1

Sie wollen row_number() OVER (ORDER BY m.money) + ? usw.