ulimativ: MySQL - Anzahl der Zeilen in einer Tabelle

Hi!
Ich habe eine Tabelle in MySQL und will die Anzahl der Datensätze, die in der Tabelle gespeichert sind.
Moment, also mit SELECT * ... und anschliessendem PHP mysql_num_rows kann ichs auch. Aber geht das auch direkt in MySQL ohne vorhergehende SELECT-Anweisung???
und weg...
Uli

  1. Hallo!

    Ich habe eine Tabelle in MySQL und will die Anzahl der Datensätze, die in der Tabelle gespeichert sind.
    Moment, also mit SELECT * ... und anschliessendem PHP mysql_num_rows kann ichs auch. Aber geht das auch direkt in MySQL ohne vorhergehende SELECT-Anweisung???

    Wie wärs mit SELECT COUNT(*)...?

    Grüße
    Andreas

    1. Wie wärs mit SELECT COUNT(*)...?

      Gibt mir "SELECT COUNT(*) FROM tablename"
      direkt die Anzahl der Zeilen zurück?
      Uli

      1. Wie wärs mit SELECT COUNT(*)...?
        Gibt mir "SELECT COUNT(*) FROM tablename"
        direkt die Anzahl der Zeilen zurück?
        Uli

        Ja.

        Gruß Frank

      2. Wie wärs mit SELECT COUNT(*)...?
        Gibt mir "SELECT COUNT(*) FROM tablename"
        direkt die Anzahl der Zeilen zurück?

        hast Recht, ist sogar noch komplizierter als Deine Version ;-) Mir ist aber keine derartike Funktion bekannt, aber selbst ist der Mann:

        <?
        function num_rows($tabelle){
            global $link;
            $result = mysql_query ("SELECT * FROM $tabelle",$link);
            return mysql_num_rows($result);
        }

        echo num_rows("Tabelle");
        ?>

        so sollte es prinzipiell funktionieren!

        Grüße
        Andreas

        1. Wie wärs mit SELECT COUNT(*)...?
          Gibt mir "SELECT COUNT(*) FROM tablename"
          direkt die Anzahl der Zeilen zurück?
          hast Recht, ist sogar noch komplizierter als Deine Version ;-) Mir ist aber keine derartike Funktion bekannt, aber selbst ist der Mann:

          <?
          function num_rows($tabelle){
              global $link;
              $result = mysql_query ("SELECT * FROM $tabelle",$link);
              return mysql_num_rows($result);
          }

          echo num_rows("Tabelle");
          ?>

          Wer sich bei drei Millionen Einträgen zurückhalten will, die gesamte Tabelle abzugrasen, um "nur" die Einträge zu zählen, der sollte sich mal mit dem MySQL-Befehl "SHOW TABLE STATUS" befassen. Da wird alles mögliche (unter anderem auch die Anzahl der Zeilen) angezeigt - und sicherlich schneller, als wenn man die Datenbank befragt.

          http://www.little-idiot.de/mysql/mysql-126.html

          - Sven Rautenberg

          1. Hi!

            http://www.little-idiot.de/mysql/mysql-126.html

            interessant! Wie kann ich aus PHP drauf zugreifen?

            $result = mysql_query ("SHOW TABLE STATUS FROM $tabelle",$link);
            $table = mysql_fetch_array($result):

            echo table["???"];

            ?

            Grüße
            Andreas

            1. Yo!

              http://www.little-idiot.de/mysql/mysql-126.html

              interessant! Wie kann ich aus PHP drauf zugreifen?

              $result = mysql_query ("SHOW TABLE STATUS FROM $tabelle",$link);

              Nö, einfach "SHOW TABLE STATUS" - fertig. Du kriegst eine Tabelle mit mehreren Spalten, die du am besten in einer WHILE-Schleife ausliest. Zum Warmwerden:
              while ($tabstatus = mysql_fetch_array($result))
              { var_dump($tabstatus); }

              Ganz billig gemacht.

              IMO kriegt man keine spezielle Tabelle angesprochen. Und ich muß dazusagen: Ich hab den Query mal eben schnell mit phpMyAdmin gemacht, welches seine Statusangaben ja auch so bezieht.

              - Sven Rautenberg

              1. Hallo!

                http://www.little-idiot.de/mysql/mysql-126.html

                Nö, einfach "SHOW TABLE STATUS" - fertig.

                ? http://www.mysql.com/doc/S/H/SHOW_TABLE_STATUS.html

                Du kriegst eine Tabelle mit mehreren Spalten, die du am besten in einer WHILE-Schleife ausliest. Zum Warmwerden:

                while ($tabstatus = mysql_fetch_array($result))
                { var_dump($tabstatus); }

                probier ich mal

                IMO kriegt man keine spezielle Tabelle angesprochen. Und ich muß dazusagen: Ich hab den Query mal eben schnell mit phpMyAdmin gemacht, welches seine Statusangaben ja auch so bezieht.

                Wie mit phpMyAdmin "gemacht"? Wo denn? So eine Abfrage habe cih da noch nie entdeckt - doer hast Du im Code nachgeschaut?

                Grüße
                Andreas

                1. Hallo!

                  Nö, einfach "SHOW TABLE STATUS" - fertig.
                  ? http://www.mysql.com/doc/S/H/SHOW_TABLE_STATUS.html

                  Aha, da gibts auch Parameter - interessant. Aber ohne gehts ja auch. :)

                  Wie mit phpMyAdmin "gemacht"? Wo denn? So eine Abfrage habe cih da noch nie entdeckt - doer hast Du im Code nachgeschaut?

                  Das ist auch nichts, was als Abfrage per Klick angeboten wird. Aber wenn du Gelegenheit hast, einen SQL-Query in eine Textarea zu schreiben, dann kannst du praktisch alles von der Datenbank wissen wollen - und sie antwortet dir, schön formatiert.

                  Also im Prinzip: phpMyAdmin aufrufen, einen Klick auf irgendeine Datenbank, und dann "SHOW TABLE STATUS" eingeben. Damit kriegst du den Tabellenstatus der angeklickten Datenbank.

                  Ein kurzes Experiment mit den Parametern:
                  FROM database
                  Selektiert eine andere als die aktuelle Datenbank. Damit könnte man also auch Infos von anderen Datenbanken kriegen.
                  LIKE 'string'
                  Selektiert die angezeigten Tabellen näher. Wildcards sind erlaubt, LIKE '%log%' holt Infos über alle Tabellen, die in ihrem Namen 'log' enthalten.

                  Ein sehr schöner Befehl, muß ich sagen. Wenn man das Ergebnis denn wirklich nicht anders kriegen kann.

                  - Sven Rautenberg

                  1. Hallo ;-(

                    Habe gerade ne halbe Stunde an ner Antwort gesessen, eine falsche Taste und weg...
                    Naja, nochmal, aber kürzer ;-)

                    Aha, da gibts auch Parameter - interessant. Aber ohne gehts ja auch. :)

                    Ne, hast Recht, ich dachte da stand "FROM tabelle.."

                    Also im Prinzip: phpMyAdmin aufrufen, einen Klick auf irgendeine Datenbank, und dann "SHOW TABLE STATUS" eingeben. Damit kriegst du den Tabellenstatus der angeklickten Datenbank.

                    Stimmt ja, daeran hate ich nicht gedacht! Interessant!
                    Was mir so nebenbei aufgefallen ist, Tabellen mit fixen Spalten können im Gegensatz zu dynamischen bis zu 200 mal mehr Daten aufnehmen! Ich meine, ich werde zwar in absehbarer Zeit nicht über 4 GB hinausgehen, aber wenn ich mal 1 TB brauche weiß ich jetzt wo ich es hernehme ;-) Aber wirklich, höchst interessant!

                    Ein kurzes Experiment mit den Parametern:
                    FROM database
                    Selektiert eine andere als die aktuelle Datenbank. Damit könnte man also auch Infos von anderen Datenbanken kriegen.

                    Nanana, hat da jemend zu viele User in der DB? Ich kann das nicht, obwohl ich 2 DB habe, aber ich habe auch für beide einen anderen User, also geht es bei mir nicht.

                    LIKE 'string'
                    Selektiert die angezeigten Tabellen näher. Wildcards sind erlaubt, LIKE '%log%' holt Infos über alle Tabellen, die in ihrem Namen 'log' enthalten.

                    Sollte man wohl in diesem Fall machen, damit man nicht mysql_fetch_array() in der Schleife abfragen muß, sondern direkt die riochtige Tabelle hat! Und LIKE sollte an dieser Stelle auch nicht nachteilig sein ;-)

                    Ein sehr schöner Befehl, muß ich sagen. Wenn man das Ergebnis denn wirklich nicht anders kriegen kann.

                    Wie meinst Du das? Außer das wir mit deieser Lösung beim ursprünglichen Problem womöglich mit Kanonen auf Spatzen schießen, kanne ich keine andere Abfrage, die vergleichbare Infos liefert! Also ich bin schwer begeiistert...

                    So, und jetzt nichts falsch machen beim abschicken...

                    Grüße
                    Andreas

                    1. Moin!

                      Ein sehr schöner Befehl, muß ich sagen. Wenn man das Ergebnis denn wirklich nicht anders kriegen kann.
                      Wie meinst Du das? Außer das wir mit deieser Lösung beim ursprünglichen Problem womöglich mit Kanonen auf Spatzen schießen, kanne ich keine andere Abfrage, die vergleichbare Infos liefert! Also ich bin schwer begeiistert...

                      Das meine ich so: Wenn man die Anzahl der Einträge in einer Datenbank braucht und nicht bereits "SELECT irgendwas FROM tabelle" gemacht hat (was man mit mysql_num_rows() auswerten könnte), dann ist dieser Befehl ganz brauchbar. Vor allem, wenn man (was ja nicht unüblich ist) auf irgendeiner (Admin-)Seite Statistiken ausgeben will, wieviel denn in der Datenbank gespeichert ist. Nachteil: Man kann nicht filtern und so als gelöscht oder noch nicht freigegeben gekennzeichnete Datensätze von der Ermittlung ausnehmen.

                      Von daher: Nett, den Befehl zu kennen. Aber er ist schlicht nur ein Ersatz für einen einzigen Anwendungsfall, und nicht universell.

                      - Sven Rautenberg

                      1. Hallo!

                        Das meine ich so: Wenn man die Anzahl der Einträge in einer Datenbank braucht und nicht bereits "SELECT irgendwas FROM tabelle" gemacht hat (was man mit mysql_num_rows() auswerten könnte), dann ist dieser Befehl ganz brauchbar.

                        Naja, bei mir sind Selects ohne WHERE bedingung eher selten gesäht, daher werde ich vielleicht bei Gelegenheit mal ausprobieren...

                        Vor allem, wenn man (was ja nicht unüblich ist) auf irgendeiner (Admin-)Seite Statistiken ausgeben will, wieviel denn in der Datenbank gespeichert ist.

                        Jo, das stimmt, mal schaun!

                        Nachteil: Man kann nicht filtern und so als gelöscht oder noch nicht freigegeben gekennzeichnete Datensätze von der Ermittlung ausnehmen.

                        Ja, wie auch? Das machst Du ja individuell, so wie Du Dir das überlegst hast, und greifst nicht auf irgendeine hierfür vorgesehene Möglichkeit der RDBMS zurück, oder? Daher - MySQL kann leider (noch) nicht hellsehen!

                        ABER: Timestamp ist ja schon eher was womit mysql was anfangen könnte. Kennst Du irgendeine Möglichkeit, alle Datensätze zu bekommen, die einen Timestamp haben größer als X? Was würde ich dafür geben, wenn ich einen mysqldump machen könnte, nur mit Datensätzen älter als... Aber ich habe bis jetzt keine andere Möglichkeit gefunden, als mit SELECT aus jeder Tabelle einzelnd die Datensätze zu ermitteln und die Inserts generieren... sehr umständlich, aber Du kennst da wahrscheinlich auch keine Befehle in dieser Richtung, oder? Egal was, wenn Du irgendwas in dieser Richtung kennst, bitte sag es mir ;-) Auch wenn es nicht dasselbe ist, nur ein Ansatzpunkt würde mir schon sehr helfen!

                        Von daher: Nett, den Befehl zu kennen. Aber er ist schlicht nur ein Ersatz für einen einzigen Anwendungsfall, und nicht universell.

                        Halt für ne Übersicht oder allgemeine Infos zu einer/mehrern Tabellen. Ich finds nett, auch wenn ich es weniger brauche - wofür gibt es phpMyAdmin... und für eigene Scripte ist es leider zu pauschal...

                        Grüße
                        Andrea