fablei
Goto Top

mySQL - Wie zähle ich Einträge die keinen count haben

Hallo Forum,

ich habe zwei Tabellen. Die eine enthält Altersstufen (Tabelle alter), die andere enthält dazugehörige Texte (Tabelle texte).


id alter
1 10-12
2 13-15
3 16-18
4 19-27

id alter_id texte
1 3 bla
2 3 blub
3 3 lala
4 1 haha

Nun brauche ich eine Abfrage, die mir sagt wieviele Texteinträge es zu der jeweiligen Altersstufe gibt.
Folgendes habe ich dazu schon, das ist aber nicht was ich brauche:

Select COUNT(texte.id) AS Anzahl, alter.id
FROM texte
JOIN `alter` ON texte.alter_id = alter.id
WHERE
-hier ein paar Bedingungen-
GROUP BY alter.id

Diese Abfrage würde mir aber nur folgendes Ergebnis liefern:

Anzahl alter.id
3 16-18
1 10-12

Ich möchte aber dieses Ergbnis:

Anzahl alter
1 10-12
0 13-15
3 16-18
0 19-27

Wie lässt sich das als SQL Statement formulieren?

Danke und viele Grüße,
Fabian

Content-Key: 96555

Url: https://administrator.de/contentid/96555

Printed on: April 19, 2024 at 13:04 o'clock

Member: Biber
Biber Sep 10, 2008 at 10:15:34 (UTC)
Goto Top
Moin fablei,

eine Möglichkeit von vielen:
Select COUNT(texte.id) AS Anzahl, alter.id
FROM texte
LEFT JOIN `alter` ON texte.alter_id = alter.id
WHERE
-hier ein paar Bedingungen-
GROUP BY alter.id

Grüße
Biber
Member: fablei
fablei Sep 10, 2008 at 12:02:47 (UTC)
Goto Top
Hi,

danke für die Antwort.

Leider liefert diese Abfrage dasselbe Ergebnis zurück wie meine schon gepostete.

Es werden keine Null-Treffer berücksichtigt.

Welche Möglichkeiten gibt es denn noch?

Grüße,
Fabian
Member: Biber
Biber Sep 10, 2008 at 12:35:22 (UTC)
Goto Top
Moin fablei,

hast natürlich Recht - so viel kann ein LEFT JOIN nicht bringen, wenn nach wie vor die Tabelle mit "allen Sätzen" die Tabelle "texte" bleibt....

Select COUNT(texte.id) AS Anzahl, alter.id
FROM `alter`
LEFT JOIN texte ON `alter`.id = texte.alter_id
WHERE
-hier ein paar Bedingungen-
GROUP BY alter.id

Sorry für das zu flüchtige Lesen
Biber
Member: fablei
fablei Sep 10, 2008 at 13:22:18 (UTC)
Goto Top
Hm ich glaube langsam das Grundproblem ist der count(). Dieser scheint, wenn es keinen Datensatz gibt der die Bedingungen erfüllt, nicht einfach eine 0 auszugeben, sondern lieber gar nichts.

Prinzipiell hast du ja Recht. Die Tabelle alter ist die Grundlage und zu jedem Datensatz soll ein Count ermittelt werden. Ist dieser aber 0 wird im Result der Datensatz nicht mehr beachtet face-sad

Habe auch schon so Sachen gelesen wie: if(count(texte.id)="",0,count(texte.id)
Das geht aber auch nicht face-sad

Ich bin verzweifelt...
Member: Biber
Biber Sep 10, 2008 at 13:45:37 (UTC)
Goto Top
Moin fablei,

wenn ich Deine Idee versuche (ungetestet) umzusetzen, dann sollte syntaktisch so etwas herauskommen:
Select 
If (IsNull(texte.id), 0,COUNT(texte.id)) AS Anzahl, alter.id
FROM `alter`
LEFT JOIN texte ON `alter`.id = texte.alter_id
WHERE
-hier ein paar Bedingungen-
GROUP BY alter.id

Grüße
Biber
Member: fablei
fablei Sep 10, 2008 at 13:56:23 (UTC)
Goto Top
Habs mal gerade versucht. Klappt leider auch nicht. Immer das selbe. Die Nuller bleiben weg. Fraglich ist ja auch, ob das vielleicht Absicht ist und wir hier irgendwas wichtiges vergessen. Vielleicht hat das einen guten Grund warum solche Konstrukte immer nur die Datensätze ausgeben, die mit der Abfrage übereinstimmen und nicht die die quasi die Negativabfrage erfüllen würden.

Grüße,
Fabian
Member: SvenGuenter
SvenGuenter Sep 10, 2008 at 14:53:41 (UTC)
Goto Top
Naja fast. Das Problem ist nicht das der Wert <NULL> ist sondern gar nicht da.
Wenn ich das richtig sehe ist das du einen Count auf die alter.Table machen musst. Und dazu einen full outer Join oder right outer join auf die Leute. Dann müßte es klappen.
Verbal Ausgedrückt

Zähle alles auch wenn es keinen eintrag in der tabelle Texte hat.
Select count(alter.id) from
alter right outer join texte on alter.id = texte.alter_id