luckger: MYSQL ABFRAGE

Hallo zusammen,

ich habe ein Problem bei einer Datenbankabfrage. Der zugehörige PHP Code lautet wie folgt:

$sql = "SELECT *,SUM(page_views) AS summe_page_views FROM $db_tab WHERE DATE_FORMAT(last_view,'%d.%m.%Y' )='$datum_heute'";

$result = @mysql_query ($sql,$db);

$row = mysql_fetch_object($result);

echo $row->summe_page_views;

Nun wenn ich das Ganze laufen lasse, dann bekomme ich jedesmal einen Fehler zurückgemeldet:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

Interessant wird das Ganze wenn man den * weglässt, also nur noch die Summe berechnet --> der Fehler verschwindet, der Sinn der Abfrage aber leider auch ....

Kann mir irgendjemad weiterhelfen?

Vielen Dank schonmal im voraus,

luckger

  1. Hallo

    ich habe ein Problem bei einer Datenbankabfrage. Der zugehörige PHP Code lautet wie folgt:

    es gibt keinen zugehörigen PHP-Code. Bitte poste das SQL-Statement, auch wenn
    hier ein typischer Anfängerfehler zu sehen ist.

    $sql = "SELECT *,SUM(page_views) AS summe_page_views FROM $db_tab WHERE DATE_FORMAT(last_view,'%d.%m.%Y' )='$datum_heute'";

    Ist es grundsätzlich schon eine sehr schlechte Idee SELECT * zu schreiben, so ist es in diesem Falle völliger Unsinn.

    Schließlich musst Du nach _jeder_ einzelnen Spalte gruppieren, auf die keine
    Aggregatsfunktion angewandt wird - da Du eine Aggregatsfunktion verwendest.

    Interessant wird das Ganze wenn man den * weglässt, also nur noch die Summe berechnet --> der Fehler verschwindet, der Sinn der Abfrage aber leider auch ....

    Da die Abfrage von jedem DBMS, erstaunlicherweise sogar von MySQL als fehlerhaft
    zurückgewiesen wird, ist sie sowieso sinnlos. Bitte beachte, dass jede Spalte,
    die nicht eindeutige Werte aufweist, in Deiner Query irgendwelche zufälligen
    Werte aufweisen wird. Vermutlich ließe sich Dein Problem mit einer korrelierten
    Unterabfrage lösen, mangels Beispieldaten und dem daraus resultierenden
    Ergebnis läßt sich Dir nicht weiter helfen.

    Weiterhin wichtig: Welche MySQL-Version ist im Einsatz?

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      erstmal Danke für die schnelle Antwort. Die php-Version lautet 4.1.10a (laut phpinfo())

      Naja wie würdest du die Abfrage dann umschreiben? Ich möchte eigentlich nur alle Werte der Spalte page_views aufsummieren, wenn in der Tabelle last_view das aktuelle Datum steht.

      Bei einer count() Abfrage hat das Ganze schon ohne weiteres funktioniert (SELECT last_view,count(DATE_FORMAT(last_view,'%d.%m.%Y' )) AS anzahl_last,DATE_FORMAT(last_view,'%d.%m.%Y' ) AS last_view_format FROM $db_tab GROUP BY DATE_FORMAT(last_view,'%d.%m.%Y') ORDER BY anzahl_last DESC LIMIT 1)

      [quote]Vermutlich ließe sich Dein Problem mit einer korrelierten
      Unterabfrage lösen[/quote]

      Was ist das?

      [quote]mangels Beispieldaten und dem daraus resultierenden
      Ergebnis läßt sich Dir nicht weiter helfen.[/quote]

      Welche Beispieldaten / welches Ergebnis bräuchtest du?

      Danke nochmal,

      luckger

      1. Hallo

        erstmal Danke für die schnelle Antwort. Die php-Version lautet 4.1.10a (laut phpinfo())

        nein, die PHP-Version interessiert mich nicht im Geringsten. Mich interessiert,
        welche MySQL-Version Du im Einsatz hast. Die Version erhältst Du mit der
        Anweisung:

        SELECT VERSION()

        Naja wie würdest du die Abfrage dann umschreiben? Ich möchte eigentlich nur alle Werte der Spalte page_views aufsummieren, wenn in der Tabelle last_view das aktuelle Datum steht.

        Woher soll ich das wissen. Ich weiß nicht, welche Spalten Deine Tabelle hat,
        welche Werte enthalten sind - und was das von Dir gewünschte Ergebnis ist.

        Vermutlich ließe sich Dein Problem mit einer korrelierten
        Unterabfrage lösen

        Bitte lasse doch die Zitatzeichen in Ruhe. Spezialcode für Zitate sind hier
        nicht erforderlich :-)

        Was ist das?

        siehe z.B: dieses Archivposting.

        mangels Beispieldaten und dem daraus resultierenden
        Ergebnis läßt sich Dir nicht weiter helfen.

        Welche Beispieldaten / welches Ergebnis bräuchtest du?

        Deine Tabelle, ein paar Datensätze - und das von Dir gewünschte Ergebnis der
        Abfrage bei genau diesen Datensätzen mit der Begründung, warum Du dieses
        Ergebnis haben möchtest.

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          also ich hatte mich nur verschrieben. 4.1.10a ist nicht die php sondern die mqsql Version. Entschuldige für den Schreibfehler.

          Also die Tabelle besteht aus den Feldern

          id
            ip (--> Ip Adresse)
            browser (z.B. Firefox)
            browser_version
            cookies (enabled? 0 oder 1)
            javascript (enabled? 0 oder 1)
            is_crawler (true? 0 oder 1)
            country
            referer
            page_views
                         (jeder Seitenklick wird hier numerisch gespeichert)
                         (kann also z.B '10' sein)
            resolution
            last_view (timestamp)
            first_view (timestamp)

          Genaue Angaben zur Tabellenstruktur und Beispielzeile habe ich an das Ende des Posts verschoben.

          Das Ganze ist die Grundlage eines Besucherzählers. Ich möchte auslesen wieviele page views an einem bestimmten Tag stattfanden. Dazu müssen die Page Views der einzelnen Zeilen zusammengerechnet werden (dazu dachte ich mir, kann man die SUM Funktion brauchen) und eben in einem where Element geprüft werden, ob lastview an eben diesem Tag stattfand.

          Ich hoffe das hilft weiter,

          Schönen Abend,

          luckger

          ___________________________________
          CREATE TABLE stats\_log\_data (
            id int(10) NOT NULL auto_increment,
            ip varchar(100) collate latin1_german1_ci NOT NULL default '',
            browser varchar(100) collate latin1_german1_ci NOT NULL default '',
            browser\_version varchar(30) collate latin1_german1_ci NOT NULL default '',
            cookies int(1) NOT NULL default '0',
            javascript int(1) NOT NULL default '0',
            is\_crawler int(1) NOT NULL default '0',
            country varchar(100) collate latin1_german1_ci NOT NULL default '',
            referer varchar(255) collate latin1_german1_ci NOT NULL default '',
            page\_views int(4) NOT NULL default '0',
            resolution varchar(50) collate latin1_german1_ci NOT NULL default '',
            last\_view datetime NOT NULL default '0000-00-00 00:00:00',
            first\_view datetime NOT NULL default '0000-00-00 00:00:00',
            PRIMARY KEY  (id)
          ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=31 ;

          ___________________________________
          Beispielzeile

          INSERT INTO stats\_log\_data VALUES (1, '91.7.125.8', 'Firefox', '2.0', 1, 1, 0, 'GERMANY', 'http://www.google.de', 2, '1280x1024', '2007-11-29 17:42:55', '2007-11-29 17:42:33');

          1. Also eine Lösung habe ich mittlerweile gefunden:
            hängt man an die SQL Abfrage ein "GROUP BY DATE_FORMAT(last_view,'%d.%m.%Y' )" an, dann bekommt man das korrekte Ergebnis.

            Gruß,

            luckger

            1. Hallo

              hängt man an die SQL Abfrage ein "GROUP BY DATE_FORMAT(last_view,'%d.%m.%Y' )" an, dann bekommt man das korrekte Ergebnis.

              wie schrieb ich schon zu Beginn:

              Schließlich musst Du nach _jeder_ einzelnen Spalte gruppieren, auf die keine
              Aggregatsfunktion angewandt wird - da Du eine Aggregatsfunktion verwendest.

              Freundliche Grüße

              Vinzenz