MySQL *erledigt* Summe der Top-10-User mit Mindestpunkten

LasMiranda

kanz pöhse
ID: 28058
L
5 Mai 2006
3.148
333
Es geht darum, dass ich die Summe der Top-10-User als Ergebnis bekomme.

Es wird MySQL 4 eingesetzt, ... leider.

Eigentlich hatte ich nämlich schon diese Abfrage, aber die geht unter der 4 scheinbar nicht, denn der Start der Unterabfrage wird als Fehlerbeginn angezeigt.

PHP:
select sum(`punkte`) FROM (SELECT `punkte` FROM `nutzer` WHERE `status`=1 AND `punkte`>=10 ORDER BY `punkte` DESC LIMIT 10) as `summe
Das hatte ich eigentlich relativ schnell, aber ich bekomm' es eben nicht für MySQL 4 hin. :(

PHP:
SELECT sum(`punkte`) FROM `nutzer` WHERE  `status`=1 AND `punkte`>=10 ORDER BY `punkte` DESC LIMIT 10
Und das erzeugt die Summe alle Einträge (WHERE wird also "ignoriert").

Durch Toplisten-Script bin ich bis jetzt auch noch nicht schlauer geworden.

EDIT: Gelöst durch Umstellung auf MySQL 5. Die JOIN-, INNER-JOIN, LEFT- oder RIGHT-JOIN-Abfrage, die für MySQL 4 funktioniert hätte, habe ich nicht gefunden. :(
 
Zuletzt bearbeitet:
Bist Du sicher, dass die komplette WHERE-Bedingung ignoriert wird
( und nicht nur das ORDER BY `punkte` DESC LIMIT 10 ) ?
 
Die Where Bedingung ist einfach falsch.

Dort wird schon geprüft ob punkte > 10 ist, die richtige prüfung müsste aber auch sum(punkte) > 10 laufen - vermute ich mal als hellseher der deine daten nicht kennt.

aber vermutlich wird in punkte immer nur 1 oder 0 drin stehen und deswegen wird die wherbedingung nie Daten finden.
 
Nein, es soll so sein, dass die der TOP-10-User angezeigt wird - deshalb das SUM.

Die Mindestpunkte der Nutzer sollen 10 sein.

Als Beispiel:
Nutzer|Punkte
n1|5
n2|3
n3|1
3 Punkte sind Minimum, also fällt n3 raus und die Summe ist 8.

Bist Du sicher, dass die komplette WHERE-Bedingung ignoriert wird...
Das stimmt, da ist ein Fehler von mir, weil die Mindestpunkte werden mit ausgewählt, aber die ganze Abfrage gilt für Datensätze, die die Mindestpunkte erreicht haben.

Es soll so was wie eine Toplist werden.
Die ersten z. B. 10 Nutzer, der Nutzer, die die Mindestpunktzahl erreicht haben, sollen extra dargestellt werden.
Der Status ist da mehr oder weniger irrelevant, da das eigentlich mehr bedeutet: aktiv oder gesperrt (hatte ich vergessen herauszunehmen).

Es kann damit natürlich auch sein, dass nicht immer genau oder mehr Teilnehmer verfügbar sind, die der WHERE-Klausel entsprechen.

Im Moment würde mir es ja reichen, wenn ich die Summe bekäme. Später würde ich natürlich umstellen, dass ich Summe der Punkte und Abfrage der jeweiligen User direkt bekomme - dann spare ich ja eine Abfrage.
 
Zuletzt bearbeitet:
eine summe über ein mysql-feld zu bilden macht nur sinn, wenn in der Tabelle zum z.B. Nutzer mehrere Zeilen enthalten sind.

Ansonsten hilft dir die WHERE-bedingung und ein ORDER BY.

Einfacher wäre es, wenn du das create-Table Statement mal hier auflistest.
Dann könnte ich/wir hier evtl. besser raten ;-)
 
Zuletzt bearbeitet:
PHP:
CREATE TABLE IF NOT EXISTS `user` (
  `userid` varchar(50) NOT NULL default '',
  `status` tinyint(1) NOT NULL default '0',
  `punkte` bigint(20) NOT NULL default '0'
);
Und als Einträge:
PHP:
INSERT INTO `user` (`userid`, `status`,`punkte`) VALUES
('user1', 1, 500000),('user2', 1, 10000),('user3', 1, 0),('user4', 0, 100000000),('user5', 1, 25678),('user6', 1, 100000);
Damit die Tabellenwerte der Top 10 mit Mindestpunktzahl 25.000 und Status=1, die meisten Punkte zuerst (formatiert).
Name|Punkte
user1|500.000
user6|100.000
user5|25.678
Summe | 625.678
Und diese 625.678 möchte ich schon per Abfrage wissen. Es sind keine 10 Teilnehmer vorhanden, trotzdem existiert ja eine "Top-Liste".

User 2+3: keine 25.000
User 4: Status 0

Wenn mehr als 10 teilnehmen, dann sollen nur die ersten 10 gezählt werden, die die Punkte- und Statusbedingung erfüllen.
(besser kann ich es nicht erklären)

Eventuell hat es sich erledigt, denn ich habe gefragt, ob MySQL 5 geht. Dann klappt das auch mit Subquerys und ich kann abfragen.
 
Ins Blaue:
Code:
select userid, punkte 
from user
where status = 1
and punkte > 25.000

oder
Code:
select sum(punkte)
from user
where status = 1
and punkte > 25.000


Habe bei mir zwar mysql5 solte aber gehen - oder :?:
;-)

Damit hast du zwar nicht die Gesamtsumme der Punkte aber die kannst du addieren...
SUM ist eine Aggregatsfunktion, eine Zustandsfunktion.

Eine Abfrage bei der du die einzelnen User aufgelistet bekommst und zusätzlich die Gesamtsumme - glaube nicht das das in einer Query geht.

Ich lass mich gern vom Gegenteil überzeugen :!:
:)
 
Zuletzt bearbeitet:
Doch, mit MySQL 5 geht es so

PHP:
select sum(`punkte`) FROM (SELECT `punkte` FROM `user` WHERE `status`=1 AND `punkte`>=25000 ORDER BY `punkte` DESC LIMIT 10) as `summe

Aber ist mittlerweile schon umgestellt und klappt nun endlich auch.

Danke für die Hilfe. :)