You are not logged in.

  • Login

1

Monday, March 10th 2008, 6:17pm

Leere Felder nicht mitzählen...

Hallo zusammen,
mir ist grad großer Bug in meinem Bewertungssystem aufgefallen:
Ich habe einige Bewertungsfelder, die nicht Pflicht sind und wo wenn keine Angabe gemacht wird in die DB ein leeres Feld reingeschrieben wird.
Leider zählt er diese aber bei meinen Schnittberechnungen dann (im Nachhinein logischerweise) mit. Wie kann ich denn die leeren Felder ausschließen? Hier mein Beispiel:

SQL Code

1
SELECT COUNT(b_service) AS anzahl_service, (SUM(b_service)/COUNT(b_service))AS schnitt_service,COUNT(b_termin) AS anzahl_termin,(SUM(b_termin)/COUNT(b_termin))AS schnitt_termin  FROM Bewertungen WHERE Was = '$hid'


müsste im Count die leeren Felder ausschließen, mit EXISTS komm ich irgendwie nicht weiter... jmd eine Idee?

2

Monday, March 10th 2008, 8:17pm

exists? Wenn du in der Abfrage nicht gruppierst, wird der COUNT auf die komplette Ergebnismenge angwendet.
Also musst du an der Ergebnismenge arbeiten.

Relevant zur Beantwortung deiner Frage wäre noch was ein leeres Feld ist? NULL? Leerer String? Mathematisches Null?

SQL Code

1
2
3
4
5
6
7
SELECT 	COUNT(b_service) AS anzahl_service, 
	SUM(b_service)/COUNT(b_service)AS schnitt_service,
	COUNT(b_termin) AS anzahl_termin,
	SUM(b_termin)/COUNT(b_termin)AS schnitt_termin  
FROM 	Bewertungen 
WHERE 	Was = '$hid'
AND	b_service IS NOT NULL

3

Sunday, March 16th 2008, 4:55pm

Hm ja das mit der kompletten Ergebnissmenge ist ein Problem, weil ich ja zwei verschiedene Sachen COUNTe. Also wenn ich 18 Bewertungen zu Service habe und 15 zu Qualität COUNTed er mir zu beiden 15. Hab die leeren Felder jetzt noch mit '0' wenn keine Bewertung abgegeben worden ist und dann mit WHERE Feld != '0' aber falls es anders besser geht kann ichs auch schnell ändern...
Wie kann ich denn die Abfrage gruppieren, dass es mir die unterschiedliche Anzahl an Bewertungen richtig ausgibt?

SQL Code

1
2
3
4
5
6
7
SELECT b_hersteller,COUNT(b_service) AS anzahl_service, 
COUNT(b_termin) AS anzahl_termin
FROM Bewertungen 
WHERE b_hersteller = '$hid'
AND b_service != '0'
AND b_termin != '0'
GROUP BY b_hersteller

This post has been edited 4 times, last edit by "student2312" (Mar 16th 2008, 5:14pm)


4

Sunday, March 16th 2008, 6:11pm

Du speicherst zwei Arten von Bewertungen in einer Spalte? Ist das Design normalisiert?
Ich würde dir empfehlen für jede Art von Bewertung entweder einen Eintrag zu machen (und dann über BewertungsTyp zu seperieren) oder gar für beide Arten von Ratings eine eigene Tabelle zu erstellen.

Um dein Problem bei aktuellem Layout zu lösen machst du einfach ein UNION.

SQL Code

1
2
3
(SELECT ... WHERE b_hersteller = '$hid' AND b_service != '0')
UNION
(SELECT ... WHERE b_hersteller = '$hid' AND b_hersteller != '0'(

5

Monday, March 17th 2008, 6:44pm

Ja das mit dem einzeln hatte ich mir auch überlegt, bloß habe ich da 5 oder mehr Arten von Bewertungen und da wäre es dann schon sehr umständlich... Aber das mit dem UNION hört sich sehr gut an das werde ich gleich mal ausprobieren! Vielen Dank für deinen Support!

Similar threads

Social bookmarks