# SQL Abfrage, Anzahl Gesamttreffer ermitteln wenn Limit gesetzt



## Registrierer (5. Mai 2013)

```
SELECT id FROM tabelle WHERE id > '1' LIMIT 10
```

Jetzt habe ich 10 Treffer, obwohl es eigentlich 1000 Einträge gibt.
Kann ich aus gleicher Abfrage die Gesamtanzahl Treffer mit einbauen, oder müsste ich um die Gesamtanzahl zu ermitteln eine zweite Abfrage ohne Limit machen?

Zielausgabe: 10 Treffer von 1000


----------



## Yaslaw (5. Mai 2013)

Da die 10 ja ein von dir gesezter Wert ist:

```
SELECT 
    10 AS anz,
    COUNT(*) AS total
FROM
    tabelle
WHERE
    id > 1
```

Achja, wenn id eine Zahl ist, dann vergleiche sie auch als Zahl, nicht als String.


----------



## Registrierer (5. Mai 2013)

Danke, verstehe das Prinzip nicht ganz. Das wäre jetzt ein konkretes auf meine DB bezogenes Beispiel:
Es gibt 110 Einträge gesamt die darauf passen, aber es wird nur ein Datensatz angezeigt, es sollten jedoch 10 sein.


Yaslaw hat gesagt.:


> ```
> SELECT
> NAME_1,
> 10 AS anz,
> ...


War nur ein Beispiel...


----------



## Yaslaw (6. Mai 2013)

Undda soll immer 10 von 110 angezeigt werden oder Item-Nr von 110?
Ich geh mal vom 2ten aus.

Ungetestet:

```
SELECT
    -- Zähler um eines erhöhen
    @itemNr := @itemNr + 1 AS nr,
    vars.gesammt,
    t.id,
    t.name
FROM
    -- vars gibt genau eine Zeile zurück
    (
        SELECT 
            -- Zählen wieviel Zeilden gefunden werden
            count(*)  AS gesammt,
            -- gleich unseren Zähler initialisiren
            @itemNr := 0
        FROM 
            my_table AS tg
        WHERE 
            -- Hier die gleichen Bedinungen wir im Haubtquery.
            tg.name LIKE '%xy%'
    ) AS vars,
    my_table AS t
WHERE 
    t.name LIKE '%xy%'
LIMIT 10
```


----------



## Registrierer (12. Mai 2013)

Ich denke, ich habe meine Frage falsch gestellt. Ich versuch es noch einmal:

Tabelle:

id     name

1      anton
2      guenther
3      gisela
4      gerd

```
SELECT name FROM Tabelle WHERE name like 'g%' LIMIT 2
```
gibt mir als Ergebnis 2 Datensätze, da ja die Ausgabe auf 2 limitiert ist.
Um jetzt eine Aussage zu formulieren wie:
2 von 3 Datensätzen gefunden, mache ich noch eine zweite Abfrage ohne Limit mit gleichen Kriterien:

```
SELECT COUNT(id) AS anzahl FROM Tabelle WHERE name like 'g%'
```
Ausgabe: 3

Und jetzt die Frage:

Muß ich hier 2 Abfragen machen, oder kann man das in einer kombinieren?


----------



## BaseBallBatBoy (22. Mai 2013)

COUNT() ist eine Aggregatsfunktion und liefert einen einzigen Wert zurück. Wie willst du denn das mit deiner ersten Query kombinieren? Die liefert ja maximal so viele Werte (=name) zurück wie du per Limit definierst. Da ist mir nicht klar was genau du denn erwartest.

Mach mal mit deiner Tabelle Oben ein Beispiel was du als Resultat der Query erwarten würdest. Welche Spalten sollte es da geben und wie sollten die befüllt sein?


----------



## Registrierer (23. Mai 2013)

Ich wüsste nicht, wie ich es noch besser erklären könnte.

Durch Limitierung wird die Ausgabe begrenzt. Ohne Limitierung hätte ich alle Datensätze.

Ich muß also wenn ich beide Ergebnissummen haben möchte, 2 Abfragen mit identischen Kriterien machen um z. B. folgendes Ergebnis zu erhalten:

10 angezeigte Datensätze von insgesamt 100.


----------



## BaseBallBatBoy (24. Mai 2013)

Und ich kann nicht verstehen was denn so kompliziert daran sein kann, uns dein erhofftes Queryresultat klar mitzuteilen..... (Tipp: mach eine Resultattabelle!)

> 10 angezeigte Datensätze von insgesamt 100
Ich treff jetzt einfach mal eine Annahme aufgrund dieser Aussage. Ich vermute nun, dein erhofftes Queryresultat für die Beispieltabelle von dir ist folgendes:

Beispieltabelle:

id name
1 anton
2 guenther
3 gisela
4 gerd

Queryresultat:

limited_cnt total_cnt
2 3


Sowas wirst du so mit einer eingzigen Query erhalten:

```
SELECT 
CASE WHEN COUNT(name) > 2 THEN 2 ELSE COUNT(name) END AS limited_cnt,   -- hier definierst du dein limit    
COUNT(name) AS total_cnt 
FROM Tabelle 
WHERE name like 'g%';
```


----------



## BaseBallBatBoy (24. Mai 2013)

> 10 angezeigte Datensätze von insgesamt 100
oder aber du willst wirklich die limitierten Datensätze anzeigen und mit dem total_cnt vebinden. Basierend auf deiner Beispieltabelle also als Resultat:

Queryresultat:

name total_cnt
gerd 3
gisela 3

Das wirst du so kriegen:

```
SELECT 
name,
(SELECT COUNT(name) FROM Tabelle WHERE name like 'g%') AS total_cnt
FROM Tabelle 
WHERE name like 'g%'
LIMIT 2;
```

Oder auch etwas schöner:

```
SELECT 
a.name,
b.total_cnt
FROM Tabelle a, (SELECT COUNT(name) AS total_cnt FROM Tabelle WHERE name like 'g%') b
WHERE a.name like 'g%'
LIMIT 2;
```


----------



## Registrierer (26. Mai 2013)

BaseBallBatBoy hat gesagt.:


> ```
> SELECT
> a.name,
> b.total_cnt
> ...


Genau das dachte ich, geht gar nicht, HEUREKA!

Entschuldigt, wenn ich mich mit der Fragestellung etwas schwer getan habe...


----------

