PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : count & Wert in Maximalwert-Zeile ausgeben



theonlychriss
08-03-2002, 17:42
Hallo,
ich stelle mit PHP eine Abfrage an MySQL, die mir Zeilen mit denselben IPs zählen und die häufigste IP (nur die IP, nicht die ganze Zeile) ausgeben soll. Im Moment habe ich mir eine Krücke gebaut, indem ich erst zwei temporäre Tabellen (mit den Namen tmpg und tmp_gesamt) erstelle, dann folgendes ausführe:

# in die Spalte "anzahl" in tmpg wird die Anzahl der IPs eingetragen:

$ip_in_tmpg = "INSERT INTO tmpg SELECT ip, count(ip), datum FROM jahr GROUP BY ip;";

# Das Maximum als Zahl in die tmp_gesamt schreiben
$max_in_tmp_gesamt = "INSERT INTO tmp_gesamt SELECT MAX(anzahl) FROM tmpg;";

Dann kommt:

$ip_aus_tmp_gesamt = "SELECT jahr.ip FROM jahr, tmpg, tmp_gesamt WHERE jahr.ip=tmpg.ip AND tmpg.anzahl=tmp_gesamt.ip LIMIT 1;";

und

$ip_abfrage_gesamt = @mysql_query("$ip_aus_tmp_gesamt");
$ip_gesamt = mysql_fetch_row($ip_abfrage_gesamt);

um die IP, die am häufigsten vorkommt, zu erhalten. Dann werden alle tmp-Tabellen wieder gelöscht.
Tja, spätestens jetzt seht ihr wohl, daß ich noch keine Ahnung von MySQL habe, daher nun die Frage, ob das auch einfacher geht, denn ich habe 3 Tabellen (eine Gesamt- das ist die hier, dann eine für Jahr und eine für Monat) mit jeweils einer zweiten Tabelle für die IP an sich.
Gibt's da einen Trick mit MAX(), den ich nur nicht anwenden konnte (in EINER Abfrage)?

Hoffentlich habe ich das nicht zu konfus formuliert. Falls doch, dann fragt bitte, denn mit diesem Konstrukt wird's echt unübersichtlich. Wenn ich in 2 Monaten noch mal da ran müßte, würde ich bestimmt nichts mehr raffen.

Gruß
Chriss

Christoph
12-03-2002, 10:45
Mit einer zusätzlichen HAVING-Klausel sollte es eigentlich
mit einem einzigen Satement gehen, etwa:

SELECT ip, count(ip) num, datum FROM jahr GROUP BY ip HAVING num=max(num);

Ob MySQL als "Popel-Datenbank" das allerdings unterstützt, weiss ich nicht.

theonlychriss
12-03-2002, 21:36
Klasse, es klappt auch mit Popel-DBs ;) ! Allerdings nur so:

SELECT IP, COUNT (IP) AS num FROM jahr GROUP BY IP HAVING num>=1 ORDER BY num LIMIT 1;

Er mag das mit dem max(num) leider nicht. Aber so geht's ja auch. Dummerweise kommt nun das nächste Problem:
Ich habe nur die Abfrage geändert, aber er meckert dann:

Warning: Supplied argument is not a valid MySQL result resource in "meiner_php_datei" line xy - wobei xy die Zeile mit $ip_gesamt = ... ist.

Die betreffenden Zeilen sehen so aus:
$ip_abfrage_gesamt = @mysql_query("SELECT IP, COUNT (IP) AS num FROM jahr GROUP BY IP HAVING num>=1 ORDER BY num LIMIT 1");
$ip_gesamt = mysql_fetch_row($ip_abfrage_gesamt);

In dem Stil sah's ja auch vorher aus, aber jetzt kommt immer diese Fehlermeldung. Die habe ich schon öfter gesehen und dann irgendwas mit Arrays gemacht, hat hier aber nicht gefruchtet. Weißt Du vielleicht auch an dieser Stelle weiter?

Vielen Dank schonmal für den ersten Tip und für den zweiten im voraus auch!
Chriss

theonlychriss
20-03-2002, 07:48
Um das Thema nun zu schließen: Alles geht nun wie es soll und ich habe ca. 40 Zeilen Code weniger. Perfekt!