MySQL - Anzahl Zeilen?

zef

Grünschnabel
Hallo!

Ich nutze eine Tabelle, aus der ich immer eine gewisse Anzahl Zeilen anzeige. Es soll möglich sein zu den nächsten X Seiten weiterzuschalten. Die Möglichkeit weiterzuschalten soll nur gegeben werden, wenn wirklich mehr anzuzeigen ist.
Um den Server weniger zu belasten wähle ich die anzuzeigenden Zeilen mittels "SELECT... LIMIT n,m" aus. Gibt es einen besseren Weg, die Gesamtzahl der Zeilen zu ermitteln als durch einen weiteren SELECT ohne LIMIT?

Ausser MySQL wird JSP eingesetzt, falls das irgendwie nutzt.

Danke schonmal :)

Edit: Einige fehlende Worter eingefügt, zu schnell gedacht ;)
 
Zuletzt bearbeitet:
Hi,

alles nur so als Gedankenstoß

Limit ist eigentlich keine schlechte Lösung, über mySQL auch rel. einfach zu lösen.
hier ein Bespiel für php mit Blätterlinks vor und zurück, Seitenzahlen

PHP:
<?
$host="localhost";
$user="root";
$pass="";
$dbase = "benutzer";

$db = mysql_connect($host, $user, $pass) OR die(mysql_error());
mysql_select_db($dbase, $db) OR die(mysql_error());

$_GET["pagenum"] = (!isset($_GET["pagenum"]) || $_GET["pagenum"] == 0 || empty($_GET["pagenum"])) ? 1 : $_GET["pagenum"];
$perpage = 4;

$limitlower = ($_GET["pagenum"]-1)*$perpage+1;
$limitupper = $_GET["pagenum"] * $perpage;

$sql = "select * from seminar limit ".($limitlower-1).",".$perpage;
$rs = mysql_query($sql);
$row = mysql_fetch_array($rs);

$sql_hits = "select count(*) as hits from seminar";

$r_sql_hits = mysql_query($sql_hits,$db);
$r_sql = mysql_query($sql,$db);

if($r_sql){
$hits = mysql_fetch_row($r_sql_hits);
$hits = $hits[0];
$limitupper = ($limitupper > $hits) ? $hits : $limitupper;
$limitlower = ($limitlower > $hits) ? $hits - $perpage : $limitlower;
$limitlower = ($limitlower <= 0) ? $limitlower = 1 : $limitlower;
if($hits==0){
//FEHLERROUTINE
}else{

echo "<table border>";

$a = 0;
$b = 2; // Anzahl der Spalten
$i = 0;
do {
    if($a == 0  && $i++ != 0) echo "<tr>\n";
    echo "<td>".$row[0]."</td>\n";
    $a++;
if($a >= $b) {
  echo "</tr>\n";
  $a = 0;
  }
}  while ($row=mysql_fetch_array($rs));
if($a != 0) {
while ($a < $b) {
    echo("<td>&nbsp;</td>\n");
    $a++;
}
echo("</tr>\n");
}
echo "</table>";

$page = ($hits<$perpage) ? 1 : ceil($hits/$perpage);
if($_GET["pagenum"] > 1):
$left_arrow = "<a href=\"paging.php?pagenum=".($_GET["pagenum"]-1)."\" class=\"searchlink\"> &laquo; </a>";
$firstpage = "<a href=\"paging.php?pagenum=1\" class=\"searchlink\"> &laquo;&laquo; </a>";
else:
$left_arrow = "<span class=\"diseablesearchlink\"> &laquo; </span>";
$firstpage = "<span class=\"diseablesearchlink\"> &laquo;&laquo; </span>";
endif;

if($_GET["pagenum"] < $page):
$right_arrow = "<a href=\"paging.php?pagenum=".($_GET["pagenum"]+1)."\" class=\"searchlink\"> &raquo; </a>";
$lastpage = "<a href=\"paging.php?pagenum=".$page."\" class=\"searchlink\"> &raquo;&raquo; </a>";
else:
$right_arrow = "<span class=\"diseablesearchlink\"> &raquo; </span>";

$lastpage = "<span class=\"diseablesearchlink\"> &raquo;&raquo; </span>";
endif;
?>

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" class="contentblack"><?php echo "Ergebnis: ".$limitlower." bis ".$limitupper." von ".$hits; ?></td>
<td align="right">
<?php
echo $firstpage." ".$left_arrow;
for($a=$_GET["pagenum"]-3;$a<=$_GET["pagenum"]+3;$a++){
if($a > 0 && $a <= $page){
if($a==$_GET["pagenum"]):
echo "&nbsp;<span class=\"thissite\">$a</span>";
else:
echo "&nbsp;<a href=\"paging.php?pagenum=".$a."\" class=\"searchlink\">".$a."</a>";
endif;
}
}
echo $right_arrow." ".$lastpage;
?>
</td>
</tr>
</table>
<?php
}
}
?>

Alternativ, Du kannst es auch über die ID lösen, also eine jeweilige Ausgabe > bzw.< als die aufgeführte/mitgeführte aktuelle ID

Bsp. ASP (auch nicht jsp, aber evtl. ein Anstoß :))

http://www.aspheute.com/artikel/20000403.htm
 
heddesheimer hat gesagt.:
Wenn Du ein ID-Feld mit auto_increment meinst: Mach das bitte nicht!

Kurze Erklärung: Datensätze können zwischendurch gelöscht werden.

Die lange Erklärung gibt's hier:
http://www.heddesheimer.de/coaching/auto_increment.html

Gruß Marian

Hi

deshalb ja > bzw. < als die übergebene ID. Da ist es ganz wurscht, ob zwischendrin eine fehlt 5 ist immer kleiner als 8 genau wie 7 und 6. Wenn 6 und 7 fehlen, wird auf 5 zugriffen, so einfach ist das. :)

... where id < Wert order by id DESC

Access z.B. kennt kein Limit. In ASP z.B. hätte man insofern nur die Möglichkeit, über die Methode Pagesize/ AbsolutePage des Recordset-Objektes zu gehen, was nicht die performateste Lösung wäre. Performater ist es, wie im Bericht von ASPheute erklärt, die SQL abzufragen.

Für mySQL, wo das Limit zur Verfügung steht, wäre das eine ich sage mal eher eine Lösung 2. Wahl. ;)
 
Zuletzt bearbeitet:
Ab MySQL 4.0 kann man sich das performance-killende SELECT COUNT(*) vorher sparen. Man schreibt seinen limitierten SELECT dann mit der Option SQL_CALC_FOUND_ROWS und kann direkt danach mit SELECT FOUND_ROWS() die Zahl der Datensätze abfragen die ohne das LIMIT gefunden worden wären.

Simples Beispiel:
Code:
SELECT SQL_CALC_FOUND_ROWS
  artikel,
  name
FROM
  artikel
LIMIT 5
Ergebnis:
Code:
+-------+-------------------------------------+
|artikel|name                                 |
+-------+-------------------------------------+
|R384420|Material AlZnMgCu0.5F49 170x25x500   |
|144000 |Gesenkschmiedeteil Systemkasten Kombi|
|R1D0001|Material 60S20 D=2                   |
|R120100|Material St37K 13x4                  |
|R140130|Material 50CrV4 22x4                 |
+-------+-------------------------------------+
Danach:
Code:
SELECT FOUND_ROWS()
Ergebnis:
Code:
+------------+
|FOUND_ROWS()|
+------------+
|10050       |
+------------+
Nur so als Tipp. FOUND_ROWS() ist in glaub' ich nur in der englischen der MySQL-Doku und auch dort ziemlich gut versteckt: http://dev.mysql.com/doc/mysql/en/information-functions.html

Martin
 
Zurück