Andreas: SQL-Problem

Hallo!
ich habe folgende Abfrage, die mir die DAtensätze Gruppiert nach Dateinamen mit deren Anzahl in der Tabelle ausgeben soll, sortiert -  größte Anzahl zuerst:

SELECT
   Datei,
   COUNT(ID) AS zahl
FROM h_log
   GROUP BY Datei
   ORDER BY zahl DESC

Das komische ist:
Wenn ich das so mache, fehlt die Seite mit der größten Anzahl, wenn ich "Order By..." weglasse, fehlt die kleinste.

Versteht das jemand? Warum?

Grüße
Andreas

  1. Also ich verstehe nur Bahnhof:

    SELECT Datei FROM h_log GROUP BY Datei

    gibt mir 10 Datensätze zurück,

    SELECT DISTINCT Datei FROM h_log

    gibt 11?!?!?

    _WARUM_????????

    Verstehe ich irgendwas falsch???

    Grüße
    Andreas

    1. Sorry, mein Fehler.

      Ich hatte aus Versehen vor der Ausgabe-Schleife nochmal mysql_fetch_array() stehen, dadurch fehlte immer der erste Datensatz so wie Sönke mir schon unten zu einem anderen Thema geschrieben hat, aber vestehen tue ich das nicht. Man bezieht sich dann doch immer auf den array, wieso kommt man automatisch bei jeder Abfrage an den Array zum nächsten Datensatz?

      Grüße
      Andreas

      1. Moin!

        Ich hatte aus Versehen vor der Ausgabe-Schleife nochmal mysql_fetch_array() stehen, dadurch fehlte immer der erste Datensatz so wie Sönke mir schon unten zu einem anderen Thema geschrieben hat, aber vestehen tue ich das nicht. Man bezieht sich dann doch immer auf den array, wieso kommt man automatisch bei jeder Abfrage an den Array zum nächsten Datensatz?

        mysql_fetch_array() macht folgendes: Es liest den aktuellen Datensatz und schiebt den Datensatzzeiger eins weiter.

        Die Erwähnung von "aktueller Datensatz" und "schiebt eins weiter" legt nahe, daß es irgendeinen Zeiger gibt, der nach mysql_query() zunächst wohl auf den ersten Datensatz zeigt, damit dieser vom ersten mysql_fetch_array() gelesen werden kann.

        Jeder Aufruf von mysql_fetch_array() fordert also aus der Ergebnisliste die nächste Zeile ab, sofern nicht von außen eingegriffen wird.

        Diesen Eingriff von außen kann man beispielsweise mit der Funktion mysql_data_seek() erreichen.
        http://www.php.net/manual/de/function.mysql-data-seek.php

        Bemerke, daß durch mysql_fetch_array() keinesfalls immer das gleiche Array angesprochen wird. Es existiert nach einer SQL-Abfrage garkein Array auf Seiten von SQL. Mit mysql_fetch_array() weist du eine Ergebniszeile an ein Array zu. Hinterher hat das Array die Informationen der Ergebniszeile - ganz unabhängig davon, was vorher war, wird ein eventuell enthaltener Inhalt des Arrays dabei überschrieben.

        Und noch eine Eigenschaft ist praktisch: Wenn mysql_fetch_array() keine Ergebniszeile mehr zuweisen kann, wird das Ergebnis der Zuweisung "false". Man kann also ganz prima ohne Wissen darum, wie viele Ergebniszeilen es gibt mit

        while ($array = mysql_fetch_array($result))
        {
          //Zeile bearbeiten und ausgeben
        }

        alle Zeilen abarbeiten.

        - Sven Rautenberg

        1. Hallo Sven!

          Vielen Dank! Sehr interessant! Hatte ich so nicht gewußt :-)
          Aber auch das mit mysql_data_seek() ist interessant, damit könnte man ja auf die Idee kommen, durch die Datensätze zu navigieren, obwohl das mit LIMIT schon reichen sollte.
          Das einzige an der Datensatznavigation "nervt" - man braucht ja immer die kpl. Anzahl der Datensätze, um zu merken, wann man nicht mehr eine Schaltfläche "weiter" einfügen muss.

          Ich mache das immer über eine extra Abfrage mit mysql_num_rows(), wie sehr wünsche ich mir eine Stable Version vom MySQL 4.0, hab da auch mal nachgefragt, die sagen Stable kommt im Juni/Juli, dann mit Transaktionen und Replikationen, und gegen Ende des Jahres dann die Stable 4.1 mit Subselects! Da freue ich mich dann drauf!

          Wenns Dich interessiert hier die mail:

          Hallo Andreas:

          Here are the estimates:

          Stable 4.0:  June or July (Transactions and replications supported in
          4.0 MySQL Max)
          Alpha 4.1:  June (Subselects), Stable around October.

          Mit freundlichen Grussen,

          For technical support contracts, visit https://order.mysql.com/?ref=Jo

          Weswegen ich das aber meinte - in 4.0 kann man dann mit FOUND_ROWS()  ja trotz LIMIT die Gesamtzahl der Datensätze bekommen, ohne extra Abfrage!

          Grüße
          Andreas

          1. Hi Andreas,

            Das einzige an der Datensatznavigation "nervt" - man braucht ja immer
            die kpl. Anzahl der Datensätze, um zu merken, wann man nicht mehr eine
            Schaltfläche "weiter" einfügen muss.

            wieso? _Ein_ Datensatz mehr, als anzuzeigen sind, müßte doch reichen ...

            Viele Grüße
                  Michael

            1. Hi Michael!

              wieso? _Ein_ Datensatz mehr, als anzuzeigen sind, müßte doch reichen ...

              also müßte ich die Datensätze so auslesen:

              for($i=1;$i<=20;$i++){
                  $array=mysql_fetch_array();
                  ....
                  }

              Oder? Dann werden immer 20 Datesätze ausgelesen, und vorher in der SQL-Abfrage bräuchte ich dann ....LIMIT 0,21

              halt mit variablen, aber wie frage ich dann, ob es den letzten Datensatz (21) gibt?
              if ($array)?

              Grüße
              Andreas

              PS: Danke für den Tipp!

              1. Hi Andreas,

                wieso? _Ein_ Datensatz mehr, als anzuzeigen sind, müßte doch
                reichen ...
                Oder? Dann werden immer 20 Datesätze ausgelesen, und vorher in der SQL-
                Abfrage bräuchte ich dann ....LIMIT 0,21

                Genau.

                halt mit variablen, aber wie frage ich dann, ob es den letzten Datensatz
                (21) gibt?

                Indem Du ihn auch noch einliest. Entweder es geht, oder es geht nicht ...

                Viele Grüße
                      Michael