Ich habe die folgende Tabelle mit virtuellem Geld für wöchentliche Turniere:
# select * from pref_money limit 5;
id | money | yw
----------------+-------+---------
OK32378280203 | -27 | 2010-44
OK274037315447 | -56 | 2010-44
OK19644992852 | 8 | 2010-44
OK21807961329 | 114 | 2010-44
FB1845091917 | 774 | 2010-44
(5 rows)
In meinem PHP-Skript, das Benutzer auflistet, muss ich wissen, wer ein wöchentlicher Gewinner ist, damit ich Medaillen neben ihren Namen anzeigen kann. Also versuche ich diese SQL-Anweisung:
# find the weekly winners
$sth = $db->prepare('select id from pref_money
where money in
(select max(money) from pref_money group by yw)');
$sth->execute();
while ($row = $sth->fetch(PDO::FETCH_ASSOC))
@$medals[$row['id']]++;
Das funktioniert meistens, aber manchmal bekomme ich Falschmeldungen wenn ein Nutzer in einer Woche zufällig den gleichen Geldbetrag hat (aber nicht den Höchstbetrag) wie der Gewinner in einer anderen Woche.
Hat jemand eine Idee, wie man die SQL-Anweisung so ändern kann, dass wirklich nur Gewinner-IDs ausgewählt werden?
Wenn ich das Folgende versuche, erhalte ich eine Fehlermeldung:
# select id, max(money) from pref_money group by yw;
ERROR: column "pref_money.id" must appear in the
GROUP BY clause or be used in an aggregate function
Ich danke Ihnen! Alex
UPDATE: PostgreSQL 8.4.5 / CentOS und es kann Krawatten geben :-)