SELECT SUM(foo) FROM ... auf die ersten k Tupel begrenzen
Steffen Flämig
- datenbank
0 Juan
Hi,
Ich habe folgende DB:
+---+
|foo|
+---+
| 10|
+---+
| 20|
+---+
| 30|
+---+
| 40|
+---+
| 50|
+---+
und möchte die Summe der Werte in 'foo' der ersten k Werte auslesen.
SELECT SUM(foo) FROM myTable WHERE "irgendwas" ORDER BY foo
gibt mir die Summe über alle Tupel (die der "irgendwas"-Klausel entsprechen), ich möchte aber nur die k-ersten.
HAt jemand 'ne Idee?
Gruß
Steffen
Moin,
und möchte die Summe der Werte in 'foo' der ersten k Werte auslesen.
SELECT SUM(foo) FROM myTable WHERE "irgendwas" ORDER BY foo
gibt mir die Summe über alle Tupel (die der "irgendwas"-Klausel entsprechen), ich möchte aber nur die k-ersten.
HAt jemand 'ne Idee?
du kannst LIMIT benutzen
Grüsse,
Juan
Hi,
und möchte die Summe der Werte in 'foo' der ersten k Werte auslesen.
du kannst LIMIT benutzen
Das war auch meine erste Idee. Als ich mich dann gewundert habe, dass ich bei LIMIT (alles größer 0) immer die Summe über _alle_ Tupel bekommen habe, ist mir auch die Sinnlosigkeit des Einsatztes von LIMIT an _dieser_ Stelle klar geworden: LIMIT gegrenzt die Anzahl der _ausgegebenen_ Tupel, nicht die, welche in die Abfrage einbezogen werden.
Letzteres schränkt man üblicherweise mit WHERE ein.
Mir fällt aber beim besten Willen keine WHERE Klausel ein, die die ersten k Elemente aller Tublen findet, auf die der Rest der WHERE Klausel passt.
Gruß
Steffen
echo $begrüßung;
und möchte die Summe der Werte in 'foo' der ersten k Werte auslesen.
du kannst LIMIT benutzen
LIMIT gegrenzt die Anzahl der _ausgegebenen_ Tupel, nicht die, welche in die Abfrage einbezogen werden.
"Die ersten k" erhält man üblicherweise erst nach einer Sortierung.
Letzteres schränkt man üblicherweise mit WHERE ein.
Zum Zeitpunkt der Sortierung ist das WHERE bereits Geschichte. Und nun kommt das LIMIT wieder ins Spiel, vorausgesetzt du hast ein DBMS, das mit Subquerys umgehen kann (beispielsweise MySQL ab Version 4.1). Reicht dir das schon als Denkanstoß? :-)
echo "$verabschiedung $name";
Hi,
Zum Zeitpunkt der Sortierung ist das WHERE bereits Geschichte. Und nun kommt das LIMIT wieder ins Spiel,
vorausgesetzt du hast ein DBMS, das mit Subquerys umgehen kann (beispielsweise MySQL ab Version 4.1).
Habe leider nur MySQL Version 4.0.26 und kann das dort leider jetzt auch nicht ändern.
Reicht dir das schon als Denkanstoß? :-)
Leider noch nicht wirklich. Ich dachte folgendes, bitt korrigiere mich, wenn ich falsch liege:
(1) WHERE beschränkt die SELECT Abfrage auf alle Tupel, die der WHERE-Klausel entsprechen.
(2) Die Funktion SUM() bildet die Summe aus allen Werten der mit (1) ausgewählten Tupel.
(3) LIMIT schänkt die Anzahl der _ERGEBNISTUPEL_ ein
Gruß
Steffen
echo $begrüßung;
Habe leider nur MySQL Version 4.0.26 und kann das dort leider jetzt auch nicht ändern.
Nun, dann geht das mit dem Subquery nicht und was anderes fällt mit nicht ein. Doch ... eine temporäre Tabelle. In die schreibst du alle limitierten Datensätze und bildest dann über diese Tabelle die Summe.
(1) WHERE beschränkt die SELECT Abfrage auf alle Tupel, die der WHERE-Klausel entsprechen.
(2) Die Funktion SUM() bildet die Summe aus allen Werten der mit (1) ausgewählten Tupel.
(3) LIMIT schänkt die Anzahl der _ERGEBNISTUPEL_ ein
Das ist soweit richtig.
echo "$verabschiedung $name";
Hi, du bist damit grad wohl etwas an die Grenzen des Frickel/Frickler-DBMS MySQL gestossen.
[1] verwende eine neuere Version (und dedelflix Vorschlag)
[2] verwende ein anderes DBMS
[3] verwende temporäre tabellen
[4] verwende mehrere Abfragen und dynamisches SQL (also baue den zweiten Query mithilfe der Ausgabe des ersten in PHP oder was auch immer zusammen)
[5] variante x, die mir aufgrund des vorausgegangenen Alkoholkonsums nicht mehr einfällt
Ciao, Frank