Entwickler-Ecke

Datenbanken - Ergebnisse iener abfrage zählen


butterkeks - Di 06.07.10 14:39
Titel: Ergebnisse iener abfrage zählen
Hallo Leute,

ich führe mit einer TSqlQuery eine Abfrage durch die wie folgt lautet:

SQL-Anweisung
1:
SELECT * FROM Kassenbericht WHERE datum = "'+start+'" AND VerkID != "0" GROUP BY VerkID ORDER BY VerkID ASC                    

In "start" füge ich ein Datum im Stil von "2010-07-05" ein.
Das Datenbankfeld Datum ist vom Typ DATE.

Ich erhalte dann die von mir gewünschten Ergebnisse aufgelistet.

Jetzt möchte ich wissen wie ich diese Ergebnisse zählen kann. TSqlQuery.recordcount funktioniert nicht bzw. liefert nur 1 zurück obwohl es mehrere Ergebnisse sind was ich auch schon sichergestellt habe.

Ich habe inzwischen auch schon gelesen das es ein Fehler von den MYSQL treibern sein könnte.

Wie kann ich die Ergebnisse also zählen lassen ohne recordcount zu nutzen?

Moderiert von user profile iconNarses: SQL-Tags hinzugefügt


Niko S. - Di 06.07.10 15:20

Probiers mit

Quelltext
1:
SELECT *,count(*) FROM Kassenbericht WHERE datum = "'+start+'" AND VerkID != "0" GROUP BY VerkID ORDER BY VerkID ASC                    

Wenn du "count(*)" einzeln ansprechen kannst (wie in PHP z.B.), kannst du damit die Anzahl rausfischen.
Mit TSqlQuery kenn ich mich leider nicht aus.


zuma - Di 06.07.10 15:28

evtl. liegt das 'fehlerhafte' count daran, das nicht sofort alle Datensaetze aus der DB gefetcht werden. Da hilft gerne mal ein

Delphi-Quelltext
1:
2:
Query.Last; 
Query.First;

direkt nach dem Oeffnen
danach sollte der Recordcount stimmen.


butterkeks - Di 06.07.10 15:41

@ Niko: Das bringt leider nicht das was ich will.
Mit deiner Lösung bekomme ich eine Tabelle die so aussieht:

Spalte A | Spalte B | Spalte C | Count
---------------------------------------
bla | bla | bla | 1
bla2 | bla2 | bla2 | 1
bla3 | bla3 | bla3 | 1

ich will aber so etwas:

Spalte A | Spalte B | Spalte C |
--------------------------------
bla | bla | bla |
bla2 | bla2 | bla2 |
bla3 | bla3 | bla3 |

gesamt 3

@ zuma: Hab ich versucht und bekomme die Fehlermeldung das "Diese Operation bei einer unidirektionalen Datenmenge nicht möglich ist"


Nersgatt - Di 06.07.10 15:48

user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
evtl. liegt das 'fehlerhafte' count daran, das nicht sofort alle Datensaetze aus der DB gefetcht werden. Da hilft gerne mal ein

Delphi-Quelltext
1:
2:
Query.Last; 
Query.First;

direkt nach dem Oeffnen
danach sollte der Recordcount stimmen.

Allerdings werden dann auch wirlich die Datensätze vom Server geholt, obwohl man nur die Anzahl wissen möchte. Oder holst Du auch immer gleich den ganzen Kühlschrankinhalt ins Wohnzimmer, wenn Du nur wissen willst, wie viel Bier noch drin ist? :D
Besser den Server zählen lassen:

SQL-Anweisung
1:
SELECT count(*) as cnt FROM Kassenbericht...                    

Dann hast Du die Anzahl im Feld "cnt" stehen.

Jens


zuma - Di 06.07.10 16:27

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:

Allerdings werden dann auch wirlich die Datensätze vom Server geholt, obwohl man nur die Anzahl wissen möchte. Oder holst Du auch immer gleich den ganzen Kühlschrankinhalt ins Wohnzimmer, wenn Du nur wissen willst, wie viel Bier noch drin ist? :D

Jens


is klar jens, allerdings bin ich davon ausgegangen, das er eh alle Datensätze verarbeiten will. Und wenn ich richtig durst hab, ist der Kühlschrank im Wohnzimmer gut aufgehoben (am besten direkt neben dem Sessel) :mrgreen:

@Butterkeks:
Nersgatt's variante ist sicher die beste (aber darauf achten, das du die selbe Bedingung beim zählen und abfragen nutzt ;) ).


BenBE - Di 06.07.10 17:31

Es gibt für MySQL (seit MySQL5) die Möglichkeit, bei LIMIT-Abfragen die Anzahl der Datensätze vom Server zählen zu lassen, die ohne Anwendung von LIMIT zurückgeliefert werden würden. Link dazu hatte ich hier letztens mal im Forum bereits gepostet; könnte den bei Interesse aber auch noch mal kurz raussuchen. Das hat gegenüber der COUNT(*)-Variante den Vorteil, dass man nur einmal die WHERE-Clause abarbeiten lassen muss und die zweite Abfrage nahezu kostenlos vom Server dazu geliefert wird.