Marc: Mysql: Grösstes Ergebniss einer Rechnung auslesen

Moin,

ich habe folgendes Problem. Ich habe mir einen counter gebastelt, der mit mySQL arbeitet. Jeden Tag wird ein eintrag gemacht (Hits, Tag, Monat, Jahr heissen die Felder). Nun brauche ich für die Ausgabe den besucherstärksten Monat. d.h. irgendwie muss ich den maximalwert von mehreren Summer ermitteln. Also, die Besucherzahlen eines Monats errechne ich per

SELECT sum(hits) WHERE monat = '$anzeigemonat' AND jahr = '$anzeigejahr'

Gibt es eine Möglichkeit irgendwie den besten Monat festzustellen ohne die obrige Abfrage für jeden Monat durchzuführen und dann die Ergebnisse auf Grösse zu vergleichen? Ich hoffe jemand kann mir helfen

grüsse

Marc

  1. Halihallo Marc

    SELECT sum(hits) WHERE monat = '$anzeigemonat' AND jahr = '$anzeigejahr'

    Gibt es eine Möglichkeit irgendwie den besten Monat festzustellen ohne die obrige Abfrage für jeden Monat durchzuführen und dann die Ergebnisse auf Grösse zu vergleichen? Ich hoffe jemand kann mir helfen

    SELECT
          sum(hits) AS summe
       WHERE
          monat='$anzeigemonat' AND
          jahr='$anzeigejahr'
       ORDER BY summe DESC
       LIMIT 0, 1;

    also wie du es machst, jedoch nach der Summe der Hits in absteigender Reihenfolge
    sortiert; und dann einfach nur den ersten Eintrag auslesen. Dieser muss dann der Logik
    zur Folge die grösste Anzahl Hits aufweisen.
    Für eine 10-Ten-Monate-Auswertung z. B. einfach 0, 10 beim Limit setzen...

    Viele Grüsse

    Philipp

    1. Moin,

      SELECT
            sum(hits) AS summe
         WHERE
            monat='$anzeigemonat' AND
            jahr='$anzeigejahr'
         ORDER BY summe DESC
         LIMIT 0, 1;

      Ich verstehe nur nicht so ganz wie das arbeitet, bzw. kann ich noch nicht so blicken ob das wirklich funktioniert. Erst mal ist da ja keine varaibale Komponente drinne (die where-bedingung ist ja immer die gleich, wenn ich das richtig verstehe liest dieser Befehl also jedes mal die daten vom selben monat aus). Ich kann aber auch nicht so einfach den monat im where weglassen, weil dann ja wohl die jahreshits ausgelesen werden würden. Ich muss also irgendwie bei Summe definieren Zähle alle zusammen bei denen Monat gleich ist. oder sehe ich das falsch?

      grüsse

      Marc

      1. Halihallo Marc

        Ich verstehe nur nicht so ganz wie das arbeitet, bzw. kann ich noch nicht so blicken ob das wirklich funktioniert. Erst mal ist da ja keine varaibale Komponente drinne (die where-bedingung ist ja immer die gleich, wenn ich das richtig verstehe liest dieser Befehl also jedes mal die daten vom selben monat aus). Ich kann aber auch nicht so einfach den monat im where weglassen, weil dann ja wohl die jahreshits ausgelesen werden würden. Ich muss also irgendwie bei Summe definieren Zähle alle zusammen bei denen Monat gleich ist. oder sehe ich das falsch?

        ei, ei, ei, du hast recht; da hab ich mir etwas wenig dabei gedacht.
        Richtig, du musst die Summen zu jedem Monat bilden. Dies wird über einen GROUP BY über
        die Spalte monat erreicht:

        SELECT
              sum(hits) AS summe
           WHERE
              jahr='$anzeigejahr'
           GROUP BY monat
           ORDER BY summe DESC
           LIMIT 0, 1;

        Ich glaube, dass das das ist, wonach du suchst.

        Also, erstmal die Summe zu jedem Monat bilden:

        SELECT sum(hits) FROM ... GROUP BY monat      [jetzt fällt mir erst auf, du hast
                                                       das FROM vergessen!]

        dies macht man, indem man nach monat gruppiert (GROUP BY), somit wird der sum dann nur
        noch für jeden einzelnen Monat berechnet und nicht mehr über alles. Dann kommt der
        ORDER BY, welcher nach den Monats-Summen sortiert (DESC: descending, absteigend), also
        die Monate mit der grössten Hits-Anzahl zuerst. Dann der LIMIT, welcher nur noch die
        erste Monatssumme zurückgibt.

        Viele Grüsse

        Philipp