Steffen Flämig: SELECT SUM(foo) FROM ... auf die ersten k Tupel begrenzen

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

  1. 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

    1. 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

      1. 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";

        1. 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

          1. 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";

          2. 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