# Anzahl aller Einträge einer SQL Tabelle trotz LIMIT



## dobermant (10. Mai 2007)

Guten Abend,

Ich habe eine SQL Tabelle, mit mehreren 10000 Einträgen, und frage diese per LIMIT ab weil ja nicht alle Einträge bei der Ausgabe auf eine Seite passen. 

Wie bekomme ich trotzdem die Anzahl aller Einträge dieser besagten Tabelle, ohne nochmal eine 2. SQL Abfrage zu starten...

Besten Dank,

dober


----------



## Flex (10. Mai 2007)

Eindeutig falsch gelesen...


----------



## shockshell (10. Mai 2007)

Hi,

es gibt da zwei Wege:

1. Du macht eine Abfrage über die gesamte Tabelle und bestimmt offset und count manuell wenn Du über die Tabelle iterieren willst.

2. Du passt Deine SQL-Abfrage so an, dass Sie dir in einer Spalte die Anzahl aller Einträge in der Datenbank ausgibt. Hierfür brauchst Du dann eine Group by Klausel. Die Zahl steht dann zwar in jeder Zeile, aber Du kannst Sie direkt aus dem Ergebnis abrufen.

Die Erste Methode ist recht speicherlastig, aber einfach. Die zweite komplexer und rechenintensiver. 

Wenn Du aber wirklich nur die Anzahl der Einträge haben willst empfehle ich Dir eine zweite Abfrage mittels count.

Marcus.


----------



## Flex (10. Mai 2007)

So, zweiter Versuch...
Wie wäre es mit einem Subselect?


```
SELECT col1, col2, (SELECT count(*) FROM `table`) AS sum_total 
FROM `table`
LIMIT 1
```


----------



## dobermant (10. Mai 2007)

Felix Jacobi hat gesagt.:


> So, zweiter Versuch...
> Wie wäre es mit einem Subselect?
> 
> 
> ...




sollte ich das count(*)  noch auf count(id) beschränken? 

danke fuer die Antworten

gruss dober


----------



## Gumbo (10. Mai 2007)

Eine Alternative wäre die Option SQL_CALC_FOUND_ROWS, mit der zusätzlich die Anzahl der ausgewählten Datensätze gespeichert wird. Dafür ist dann allerdings eine weitere Abfrage mit FOUND_ROWS() notwendig.


----------



## Flex (10. Mai 2007)

dobermant hat gesagt.:


> sollte ich das count(*)  noch auf count(id) beschränken?
> 
> danke fuer die Antworten
> 
> gruss dober



Ehrlich gesagt weiß ich nicht, ob es einen Unterschied im Aufwand macht, bei count(*) oder count(column).


----------



## dobermant (10. Mai 2007)

danke...werds einfach testen....

schönen Abend noch


----------



## dobermant (10. Mai 2007)

Felix Jacobi hat gesagt.:


> So, zweiter Versuch...
> Wie wäre es mit einem Subselect?
> 
> 
> ...



ich muss nochmal nachfragen...sorry, habe vergessen, dass ich
eine WHERE Clausel mit drinne habe. diese wird vom SubSelect nicht berücksicht oder?

Ich möchte aber das die WHERE Clausel berücksichtigt wird, nur das LIMIT soll ignoriert werden

danke, dober


----------



## lmarkus31 (11. Mai 2007)

Hallo dober,



> ich muss nochmal nachfragen...sorry, habe vergessen, dass ich
> eine WHERE Clausel mit drinne habe. diese wird vom SubSelect nicht berücksicht oder?
> 
> Ich möchte aber das die WHERE Clausel berücksichtigt wird, nur das LIMIT soll ignoriert werden



Dann musst du in der Subquery ebenfalls die Bedingung anpassen:


```
SELECT col1, 
       col2,
       (SELECT count(*) 
          FROM tab
         WHERE col='xyz') AS sum_total 
FROM tab
WHERE col ='xyz' 
LIMIT 1
```

und nochmal noch zu deiner anderen Frage:



> sollte ich das count(*) noch auf count(id) beschränken?



Falls du COUNT() mit einer Spaltenangabe verwendest, bekommst du die Anzahl der Einträge, in denen diese Spalte nicht NULL ist. Wenn deine Spalte auch NULL-Werte zulässt ergeben sich also Unterschiede zu COUNT(*)

Markus


----------



## dobermant (11. Mai 2007)

oha, danke....das ist wichtig...
allerdings frage ich mich jetzt, ob es überhaupt noch einen Sinn macht. Wenn ich mit dem SubSelect eh die ganze WHERE Clausel mit ranhängen muss,  kann ich dass ja gleich in 2 Anfragen packen...weil so habe ich anscheinend keinen performance Vorteil oder?


danke und gruss

dober


----------



## lmarkus31 (11. Mai 2007)

Hallo dober,

da hast Du sicher Recht. Bei einigen Datenbanksystemen hast du allerdings ziemlich viel Overhead, wenn du mehrere Queries nacheinander ausführst und die Queries immer wieder geparst werden müssen usw. Dann ist es sinnvoller, es in einem Statement zu belassen. Du kannst das ganze ja gerne mal nachprüfen und die Laufzeiten vergleichen.

Alles in allem hängt es aber fast immer vom verwendeten Datenbanksystem und von der Umgebung von der du auf die Datenbank zugreifen möchtest ab.

Markus


----------



## dobermant (11. Mai 2007)

fein danke....dannn wäre meine nächste Überlegung,
gleich alle Datensätze abzufragen, ohne LIMIT. und die Aufteilung der Ausgabe auf unterschiedliche Seiten, sprich das LIMIT per PHP zu gestalten.

Die Frage ist jetzt, ob die Abfrage ohne LIMIT zu viel Speicher benötigt, da es sich wie gesagt um paar 10000Einträge handelt. Muss SQL egal ob mit LIMIT oder ohne eh immer alle Datensätze auslesen und gibt dann nur die geforderten Einträge zurück, oder hat das LIMIT positive Auswirkung auf die Performance/Speicher?

Danke nochmals...


----------

