TobiasBuschi: performante, seitenweise Darstellung einer Abfrage mit LIMIT

Hallo allerseits

Um eine seitenweise Darstellung einer Abfrage mit Seiten-Uebersicht zu machen gehe ich folgendermassen vor:

ich mache die Abfrage ohne LIMIT um die anzahl der Einträge zu ermitteln:

$res = $query("SELECT * FROM tabelle");
$num = mysql_num_rows($res);

Die Anzahl Einträge pro Seite wiess ich, so kann die Anzahl der Seiten berechnet werden. Dann mache ich die eigentliche Abfrage mit LIMIT.

$res = $query("SELECT * FROM tabelle LIMIT x,y");
while($values = mysql_fetch_array($res))
...

Da ich zweimal fast die selbe Abfrage mache, denke ich mir das es vieleicht eine performantere Lösung gibt.

Jetzt meine Frage:
Geht es schneller wenn ich mit count($primary) arbeite, gibt mir count($primary) überhaupt in jedem Fall die Richtige Anzahl Einträge zurück, auch mit komplexeren Abfragen? und kann man dann den $primary automatisch ermitteln, irgendwas wie count(PRIMARY(tabelle))? (wahrscheindlich nicht)

Oder gibt es sonst eine schnellere Lösung?

Besten Dank im Voraus
Tobias Buschor

  1. Hallo TobiasBuschi

    SELECT * FROM tabelle LIMIT x,y"

    Benötigst Du alle Spalten?
    Wenn nein, dann frage nur die ab, die Du benötigst.

    Geht es schneller wenn ich mit count($primary) arbeite,

    Ja selbstverständlich, noch besser verwende COUNT(*)

    gibt mir count($primary) überhaupt in jedem Fall die Richtige Anzahl Einträge zurück,

    Definiere bitte "Richtige Anzahl" für Deinen Spezialfall.

    auch mit komplexeren Abfragen? und kann man dann den $primary automatisch ermitteln, irgendwas wie count(PRIMARY(tabelle))? (wahrscheindlich nicht)

    Wenn schon, dann COUNT(*)

    Oder gibt es sonst eine schnellere Lösung?

    COUNT(*)

    Eine detailliertere Problembeschreibung wäre nützlich :-)

    Bezieht sich Deine Abfrage auf genau eine Tabelle?
    Benötigst Du alle Datensätze?
    Benötigst Du alle Felder?

    Freundliche Grüße

    Vinzenz

    1. Ja selbstverständlich, noch besser verwende COUNT(*)

      Das ist gut.

      gibt mir count($primary) überhaupt in jedem Fall die Richtige Anzahl Einträge zurück,

      Definiere bitte "Richtige Anzahl" für Deinen Spezialfall.

      Es betrifft alle möglichen Abfragen mit JOINS da die Abfragen dynamisch erstellt werden.
      Siehe Link unten.

      Eine detailliertere Problembeschreibung wäre nützlich :-)

      Bezieht sich Deine Abfrage auf genau eine Tabelle?
      Benötigst Du alle Datensätze?
      Benötigst Du alle Felder?

      Siehe hier:
      http://test.relationpage.ch/000/admin.php?admin=000_rel_navi&rpa_rel[main_entity]=log&rels[0][38]=38&rels[0][78]=78&sel_f[0][tree_id]=1&sel_f[38][set_id]=1&sel_f[38][visible]=1&rels[0][50]=50&&&sel_f[50][pass]=1

      Das habe ich mal programmiert, jedoch habe ich dort mit mysql_num_rows die Anzahl Einträge ermittelt.

  2. ich mache die Abfrage ohne LIMIT um die anzahl der Einträge zu ermitteln:

    $res = $query("SELECT * FROM tabelle");
    $num = mysql_num_rows($res);

    auf die Möglichkeit mit count wurdest du ja schon hingewiesen, du überträgst so die komplette Tabelle vom SQL Server.

    eine Verbesserung kannst du noch erzielen, in dem du die anzahl derReihen als Parameter mitgibst, so benötigst du diese Abfrage nur einmal.
    Das macht aber nur Sinn, wenn sie die Anzahl der Einträge nicht gravierend ändernd.

    Struppi.

    1. Danke für die Antwort

      eine Verbesserung kannst du noch erzielen, in dem du die anzahl derReihen als Parameter mitgibst, so benötigst du diese Abfrage nur einmal.
      Das macht aber nur Sinn, wenn sie die Anzahl der Einträge nicht gravierend ändernd.

      Das verstehe ich nicht ganz, kannst du mir ein Beispiel geben?

      Danke
      Tobias

      1. eine Verbesserung kannst du noch erzielen, in dem du die anzahl derReihen als Parameter mitgibst, so benötigst du diese Abfrage nur einmal.
        Das macht aber nur Sinn, wenn sie die Anzahl der Einträge nicht gravierend ändernd.

        Das verstehe ich nicht ganz, kannst du mir ein Beispiel geben?

        Ich kann kein PHP deshalb nur Pseudocode

        my $rows = param('rows') || query("SELECT COUNT(id) FROM tabelle");

        und dann der  [weiter] Link mit dem Parameter rows=$rows füttern.

        Aber das macht nur Sinn, wenn in der zwischenzeit nicht zig neue Einträge hinzukommen.

        Struppi.

        1. Danke, jetzt weiss ich wie du meinst

  3. blöd, mit count(*) geht das auch nicht, weil die dynamische Abfrage auch ein GROUP BY drin haben kann. Ich muss wohl zweimal die Abfrage machen und das erste mal mit mysql_num_row die anzahl Einträge ermitteln ):

    1. übrigens hab phpmyadmin das selbe Probelm :)

      1. übrigens hab phpmyadmin das selbe Probelm :)

        ohne genau zu sehen was du machst läßt sich das nicht sagen. Ich kann count() ohne Probleme mit group by benutzen.

        Struppi.