MySQL Count() zählt falsch !

Hallo Experten,

ich habe folgendes Problem:

Ich führe folgenden MySQL-Query aus PHP heraus aus:

SELECT years.year AS yearlist, count(years.year) AS yearcount FROM years
LEFT JOIN games ON years.year=games.release_year
GROUP BY years.year
ORDER BY yearcount DESC, yearlist

(Alle Jahre aus der Tabelle years werden geholt zusammen mit der Anzahl der in diesem Jahr erschienenen Spiele aus games, nach der Spielezahl wird absteigend sortiert.)

Das funktioniert auch so weit, bis eben auf eine Kleinigkeit.

Wenn in einem Jahr kein Spiel erschienen ist, gibt der Count ebenfalls 1 zurück statt 0 oder NULL. Damit wird die Sortierung sinnlos.

Ich bin ratlos, keine Ahnung, woran das liegen könnte.

-) Gruss, Jens

Hi Jens

Du machst ja auch einen LEFT JOIN.
Probiers mit einem INNER JOIN, dann erhältst Du die Jahre gar nicht, in welchen kein Spiel erschienen ist.

Greetz Sherman

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Sherman,

ich will aber alle Jahre !!! Ich will, ich will, ich will.

-))) Gruss

Hi Jens

Du machst ja auch einen LEFT JOIN.
Probiers mit einem INNER JOIN, dann erhältst Du die Jahre gar
nicht, in welchen kein Spiel erschienen ist.

SELECT years.year AS yearlist, count(years.year) AS yearcount
FROM years
LEFT JOIN games ON years.year=games.release_year
GROUP BY years.year
ORDER BY yearcount DESC, yearlist

Schau mal was in years.year drin steht, vermutlich ist es leer. Du kannst dann folgendes machen:

SELECT years.year AS yearlist, SUM(if(years.year > 0, 1, 0)) AS yearcount
FROM years
LEFT JOIN games ON years.year=games.release_year
GROUP BY years.year
ORDER BY yearcount DESC, yearlist

nicht getestet, sollte aber so klappen.

-) Marian

Hallo Marian,

Schau mal was in years.year drin steht, vermutlich ist es
leer.

In years.year gibt es kein NULL.

SELECT years.year AS yearlist, SUM(if(years.year > 0, 1,
0)) AS yearcount
FROM years
LEFT JOIN games ON years.year=games.release_year
GROUP BY years.year
ORDER BY yearcount DESC, yearlist

Ich habs probiert. Selbes Problem wie geschildert. Für Jahre, zu denen kein Spiel existiert und für Jahre zu denen genau ein Spiel existiert, gilt: yearcount = 1.

-(( Gruss, Jens

1 „Gefällt mir“

Probier mal etwas aus games zu zählen statt den years, also z. B. count( games.release_year ).

Ich denke dein Problem liegt daran, dass count alle Non-NULL zählt, und wenn du years.year zählst, dann hat er ja recht damit, da steht auch was drinnen.

Wenn du hingegen ein Feld aus der games-Tabelle zählst, dann müßte das richtige rauskommen, weil da dann NULL drinnen steht wenn kein Spiel vorhanden ist.

Grüße, Robert

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Robert,

danke für Deinen Versuch. Leider bringts nix. Wenn ich das so mache, werden alle Jahre, in denen keine Spiele erschienen sind, komplett weggelassen.

Ach Mist. Ich habe schon die Mailingliste probiert, auch dort weiss keiner weiter. Das gibts doch gar nicht, so ungewöhnlich ist mein query doch nicht !!

Ich will doch nur eine Liste von Jahren aus einer Tabelle auslesen und dazu die Summe der in diesem Jahr erschienenen Spiele aus einer anderen Tabelle, seien es nun 0, 1, 2 oder 5000. Ist das nun so schwer oder ungewöhnlich?

Trotzdem danke.

-( Gruss, Jens

Probier mal etwas aus games zu zählen statt den years, also z.
B. count( games.release_year ).

Ich denke dein Problem liegt daran, dass count alle Non-NULL
zählt, und wenn du years.year zählst, dann hat er ja recht
damit, da steht auch was drinnen.

Wenn du hingegen ein Feld aus der games-Tabelle zählst, dann
müßte das richtige rauskommen, weil da dann NULL drinnen steht
wenn kein Spiel vorhanden ist.

Grüße, Robert

Poste mal das Statement mit dem du es probiert hast, ich glaub du hast da einen Fehler drinnen, bei mir funktioniert das.

Hab zwei Tables, a und b, mit jeweils einem Feld jahr.

Das Statement:

SELECT a.jahr, COUNT( b.jahr ) 
 FROM a LEFT JOIN b ON ( a.jahr=b.jahr) 
 GROUP BY a.jahr;

liefert alle Jahre die in a vorhanden sind und dazu die Anzahl der Jahre aus b, 0 wenn nicht vorhanden.

Wenn ich das COUNT( b.jahr ) durch COUNT( a.jahr ) ersetzte dann erhalte ich genau den von dir beschriebenen Effekt, nämlich 1 dort wo kein Datensatz in b vorhanden ist.

Grüße, Robert

1 „Gefällt mir“

Mensch Robert,

es klappt, verdammt nochmal, es klappt. Danke, danke, ich habe Dir alle verfügbaren Sterne zukommen lassen… :smile:))

Ich lebte einfach in dem Wahn, dass im Count und im GROUP BY dieselbe Spalte stehen müßte - warum auch immer, ich Trottel. Dein Post hat mich gerettet - jetzt kann die Entwicklung meiner Website so richtig weitergehen. Ich werde Dich wohl dann in den Credits mit erwähnen, wenn sie dann mal fertig ist. :smile:

Gruss, Jens