MySQL: Zeilen in einer Tabelle zählen

martinibook

martinibook

Aktives Mitglied
Thread Starter
Dabei seit
20.08.2005
Beiträge
8.730
Reaktionspunkte
350
Hallo,

Wenn ich wissen möchte, wie viele Zeilen eine Tabelle in einer MySQL Datenbank hat, dann führe ich immer "SELECT id FROM tabelle" aus, und frage die Anzahl dann mit mysql_num_rows(); ab.

Geht das auch einfacher?

Martin?
 
select count(id) from tabelle ;)
 
Und dann einfach $anzahl = mysql_query($sql); ?
 
nee, trotzdem ein mysql_fetch_array machen.
Dort findest du dann deine zahl.
es ist so, das mysql IMMER eine tabelle zurueck gibt, egal ob daten oder nur die anzahl von spalten, oder ein simpler boolean.
 
Was bekomme ich denn dann?

$array = mysql_fetch_array($ergebnis)

$array[0] ist dann die Zeilenanzahl?
 
eigentlich schon. kann es hier gerade nicht testen, sql-server steht in der firma. sonst teste mal, ob es nicht direkt im fetcharray steckt, also:

echo mysql_fetch_array($ergebnis);

-> das kann dann deine zahl sein. auf jeden fall ist es eine dieser beiden möglichkeiten
 
PHP:
$queryString = "SELECT COUNT(*) AS count FROM table";
$queryHandle = mysql_query( $queryString );
$queryResult = mysql_fetch_array( $queryHandle );

$count = $queryResult['count'];

PHP:
$queryString = "SELECT COUNT(*) AS count FROM table";
$queryHandle = mysql_query( $queryString );
$queryResult = mysql_fetch_object( $queryHandle );

$count = $queryResult->count;
 
Bei deinem Beispiel kann man doch auch mysql_fetch_assoc(); nehmen, weil du ein assoziatives Array verwenden, oder?
 
Entweder
PHP:
$queryResult = mysql_fetch_array( $queryHandle, MYSQL_ASSOC );
oder
PHP:
$queryResult = mysql_fetch_assoc( $queryHandle );

Beides das gleiche und ist weniger aufwendig, hast du Recht.
(Wobei das bei einem Ergebnis dieser Größe, 1x1, nicht wirklich wichtig ist.. :D )
 
Ich habe folgendes "Problem":

Ich habe Personen in der Tabelle "personen" und dann die Zitate der Personen in der Tabelle "zitate". Damit ich keine redundanten Daten habe, habe ich das per Relation gemacht.

In der Abfrage rufe ich alle Personen ab und lasse dann mysql_fetch_assoc(); durchlaufen. In dieser Schleife habe ich wieder eine Abfrage, die nach Zitaten der Person per ID sucht. Somit habe ich bei ca. 30 Personen 31 Querys. Geht das besser oder einfacher?

Martin
 
Wenn Du nur die Zitate zählen möchtest, warum zählst Du dann nicht einfach die Einträge in der Tabelle „zitate“?

Oder gibt es verwaiste Zitate, die keinen Personen zugeordnet werden können? In diesem Fall machst Du erst einen JOIN der „personen“ auf „zitate“ wo personen ID = zitate ID und zählst vom Ergebnis die Zeilen.

EDIT: Sorry, war noch im Zählen drin. Das mit dem JOIN ist aber trotzdem richtig.
 
Zuletzt bearbeitet:
martinibook schrieb:
In der Abfrage rufe ich alle Personen ab und lasse dann mysql_fetch_assoc(); durchlaufen. In dieser Schleife habe ich wieder eine Abfrage, die nach Zitaten der Person per ID sucht. Somit habe ich bei ca. 30 Personen 31 Querys. Geht das besser oder einfacher?

JA! Zum sortieren sind die Datenbanken da, laß die den Job machen.

Dazu brauchst Du eine Abfrage die beide Tabellen JOINed ( über Deine Relation). Dann sortierst Du das Ergebnis mit ORDER BY und zwar erst nach autoren und dann nach Zitaten. Ergibt mit einer Abfrage ein Ergebnis a la

autor1 zitat1
autor1 zitat2
...
autor1 zitatn
autor2 zitat1
autor3 zitat1
autor3 zitat2
...
autor3 zitatn


Bei Deinem Verfahren ist die Übertragungszeit und die Übersetzungszeit Deiner Anfragen viel größer als der Aufwand für die Daten! Im Grunde textest Du den Server zu und hinderst ihn am Arbeiten. Daher löst man sowas nicht mit n Anfragen!
 
Ich habe bisher für jeden Autor ein eigenes Fieldset ausgegeben, wo der Autor im Legend-Tag stand. Wie kann ich das mit PHP dann wieder trennen?

Martin
 
Du iterierst ja mit einer Schleife über das MySQL-Ergebnis.
z.B.
PHP:
while($data = mysql_fetch_row($result))
{
// […]
}

Da kannst Du ja in die Schleife einfach eine if-Abfrage einsetzen
PHP:
if(/*Autor ist der gleiche wie der vorherige*/)
{
/* gib Zitat aus */
}
else // Autor ist jetzt ein anderer
{
/* erstelle neues Fieldset und schreibe erstes Zitat rein */
}

Setzt natürlich voraus, dass die Autoren sortiert sind (ORDER BY in SQL-Abfrage).
 
Also am Ende der Schleife setze ich dann noch eine $letzer_autor und vergleiche das dann mit dem neuen?

Martin
 
Das bisschen PHP ist dann schneller als 30 MySQL Abfragen.

Ich habe nun ein neues Problem:

In einer Relation sind Bildergalerien gespeichert, in einer anderen Tabelle die Bilder selber.
Nun brauche ich für die Indexseite eine Übersicht der Bilder, allerdings sollen die Bilder zufällig sein.

Momentan ist das so gemacht, dass für jede Bildergalerie eine Unterabfrage gestartet wird mit "ORDER BY rand() LIMIT 1".

Kann ich eine Abfrage erstellen, mit der ich für jede Galerie ein zufälliges Bild erhalte, also so eine Art 1:1 Join mit Zufall.

Martin
 
Zurück
Oben Unten