MYSQL ABFRAGE
luckger
- datenbank
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
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
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
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
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');
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
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