SQL COUNT liefert falsches Ergebnis

M

Mr. Snoot

Gast
Hio,

ich habe diese Seite mit USB-Sticks; rechts kann man mit dem [+] die Tabelle aufklappen, um Einzelergebnisse zu sehen.

Wie man sieht steht dort, dass es 4 Einzelergebnise gibt; diese werden auch durchnummeriert #1-#4. Tatsächlich gibt es aber 11 Ergebnisse.
usbsticks.png

Die Abfrage sieht so aus:
PHP:
SELECT
  COUNT(usbstick) AS anzahl, usbstick, hersteller, AVG(lesen) AS lesen, AVG(schreiben) AS schreiben, AVG(mwert) AS mwert, preis AS preis, kapazitaet, artikel, (kapazitaet/preis) As mbpe, (mwert/preis) As mbpspe, status AS status, id, breite, hoehe, bild
FROM
  usbstick
WHERE
  kapazitaet = 8 AND hersteller IN  ('SanDisk') AND schreiben >= 17
GROUP BY
  usbstick, kapazitaet
ORDER BY
  lesen DESC
COUNT(usbstick) AS anzahl ist eben 4, wie können dann aber 11 Zeilen ausgegeben werden wenn nur 4 gezählt werden?



Komischerweise existiert der Fehler nicht immer; wenn man mal die ungefilterte Tabelle anschaut gibt es einige Zeilen, wo die Anzahl stimmt und andere, wo es eben nicht stimmt.
usbsticks2.png


Ich hab überhaupt keine Idee, was da falsch sein könnte bzw. wo ich ansetzen kann :confused_alt: Any ideas?
 
Zuletzt bearbeitet:
Ohne da jetzt tief eingestiegen zu sein könnte das an der GROUP BY Klausel liegen. Die gruppiert alle versch. sticks mit allen kapazitäten (4*3 (0 bis 11)) und dem entsprechend gibt es viele Ergebnisse.

Wie sieht denn das ganze aus, wenn du die Datenbasis änderst? Also mehr oder weniger Einträge in der DB.
 
War da nicht irgendetwas dass man alle Ausgabespalten mit in Group BY hereinnehmen muss ?
Edit:
http://sql.1keydata.com/de/sql-group-by.php

"Das Schlüsselwort GROUP BY wird verwendet, wenn mehrere Spalten aus einer Tabelle (oder mehreren Tabellen) ausgewählt werden und mindestens ein arithmetischer Operator in der SELECT-Anweisung enthalten ist. In diesem Fall müssen wir nach allen anderen ausgewählten Spalten GRUPPIEREN, d.h. nach allen Spalten außer denjenigen, auf die sich der arithmetische Operator bezieht.  "
 
Zuletzt bearbeitet:
Wieso machst du denn überhaupt "COUNT(usbstick)" und nicht "COUNT(*)"?
 
Aaaah, jetzt fällt es mir wie Schuppen aus den Haaren :D Hat nichts mit dem GROUP BY oder COUNT zu tun.


Die DB-Abfrage, welche in diesem Fall 4 liefert, berücksichtigt u.a. die Filter für die Lese- und Schreibgeschwindigkeit (Lesen > 17 MB/s). Für 4 Sticks (irgendwelche der 11, nicht die ersten 4) trifft der Filter zu: also ist 4 korrekt.

Aber bei den Einzelergebnissen prüfe ich das nicht. Hier gebe ich einfach alles Ergebnisse desselben Sticks aus. Muss ich mir mal überlegen, wie ich das gestalte.


Trotzdem vielen Dank für die Denkanstöße :)



edit: hm, so ganz klappt es trotzdem nicht :freak:
 
Zuletzt bearbeitet:
Bei dir werden alle USB Sticks genommen die schreiben > 17 haben, auch wenn dort nur 1 Wert > 17 ist, werden alle von diesem gezählt.
weil where > 17.
Wenn du mit Having schreiben > 17 arbeitest müsste es funktionieren. Habe mir aber auch nicht alles genau angeschaut.
 
Ich hab die Datenbank jetzt sowieso komplett umgebaut, da es davor etliche Redundanzen gab. Sollte jetzt eigentlich laufen. Wobei der Filter für Schreiben/Lesen nur den Gesamtmittelwert erfasst, nicht die Einzelergebnisse. Weiß nicht, ob ich das ändere, denn wenn der Stick an sich angezeigt wird, braucht man auch die Einzelergebnisse nicht ausblenden. Vielleicht stell ich die etwas blasser dar oder zeig einen Hinweis an.


Mir ist auch eben aufgefallen, dass bisher die Mittelwerte des Sticks (im Bild) gar nicht gestimmt haben; das passt jetzt auch.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben