Jörg Wagner: MySQL Durchschnittswert ohne Null

Hallo,

ich habe ein kleines Kommentarskript für Fotos; dort kann man u.a. eine Bewertung abgeben von 1-5, oder keine, in diesem Fall ist der Wert in der Tabelle "0".

Auf der Seite möchte ich die durchschnittliche Bewertung darstellen, und verwende dafür folgendes Statement zur Abfrage:

$bewertungsabfrage = "SELECT AVG(bewertung) AS durchschnitt FROM kommentare WHERE id = '$foto' AND bewertung > 0";

"bewertung" ist die Spalte, die 0-5 enthält. Damit "Nichtbewertungen" nicht in den Wert einfließen, soll die Abfrage nur die Zeilen erfassen, in denen der Eintrag "bewertung" nicht 0 ist, im Query hier ganz hinten.

Leider klappt das nicht so wie gedacht, die Nuller werden eingerechnet und verfälschen den "richtigen" Wert.

Ich hab schon versucht, die Lösung via Google zu finden, allerdings habe ich nur englische Einträge gefunden und das kann ich leider nicht -.-

Ist die Abfrage falsch, oder wo liegt das Problem?

Grüße

  1. hi,

    Leider klappt das nicht so wie gedacht, die Nuller werden eingerechnet und verfälschen den "richtigen" Wert.

    Sicher?

    mysql> select avg(x) from test where x > 0;
    +--------+
    | avg(x) |
    +--------+
    | 2.0000 |
    +--------+
    1 row in set (0.00 sec)

    mysql> select x from test;
    +---+
    | x |
    +---+
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 0 |
    | 1 |
    | 2 |
    | 3 |
    +---+
    13 rows in set (0.02 sec)

    bei mir nicht,
    Hotti

  2. Hallo,

    ich hab es grad selbst probeiert.

    SELECT AVG(bewertung) AS durchschnitt FROM kommentare WHERE id = '$foto' AND bewertung > 0

    tut genau

    1. gib mir alle Datensaetze von Bewertung
    2. davon nur die fuer $foto
    3. davon nur die, die Bewertung > 0 haben
    4. berechne den Durchschnitt von den verbliebenen

    WHERE geschieht vor SELECT

    BTW ... NULL oder 0?

    Abfrage ist syntaktisch und sermantisch richtig. Dein Problem liegt woanders oder du hast nicht die ganze Wahrheit erzaehlt.

    Fuehre mal nur folgendes aus

    SELECT bewertung AS durchschnitt FROM kommentare WHERE id = '$foto' AND bewertung > 0

    dann kopier die Werte in Excel oder sonstwohin und berechne den Durschnitt von Hand und vergleiche ihn mit mit dem Wert von

    SELECT AVG(bewertung) AS durchschnitt FROM kommentare WHERE id = '$foto' AND bewertung > 0

    BTW2: Statt 0 fuer "keine Bewertung" solltest du erwaegen NULL zu speichern statt eines diskreten Wertes, der Ergebnisse von mathematischen Aggregatfunktionen verfaelschen koennte.

    Kein Englisch? Nich mal ansatzweise? In diesen Zeiten? Okay.
    Aber hat Google seinen Uebersetzungdienst eingestellt? Zu jedem fremdsprachigen Suchmaschinenergebnis zeigt Google doch immer einen Link "Diese Seite uebersetzen" oder so?

    Bitte mehr bemuehen beim Recherchieren und keine Ausreden suchen.

    Ciao, Frank