MySQL: Denkblockade bei Count() und Max()

  • #1
L

lamerc0w

Bekanntes Mitglied
Themenersteller
Dabei seit
06.10.2002
Beiträge
123
Reaktionspunkte
0
Hi,

Ich hab' hier->n paar Datensätze mit datum (jeweils Tag.Monat. (Bsp.: 06.04.)) und möchte gern wissen, wieviele Datensätze mit einem bestimmten Datum in der Tabelle vorhanden sind (-> Klappt soweit). Das Problem ist jedoch jetzt, per MAX() rauszufinden, an welchem Tag die meisten Eintragungen vorhanden sind. Leider schein' ich wohl zu blöd für' zu sein, mir die SQL-Syntax aus den Fingern zu lutschen.

Kann mir jemand->n Denkanstoß geben? Oder MUSS ich den maximalen Wert dann per PHP ermitteln?

Danke für Antworten,
rabies.
 
  • #2
OK, wenn ich das alles richtig verstanden habe, könnte es ungefähr so funktionieren:
(Voraussetzung ist allerdings, dass der Tag IMMER 2 stellig ist - führende 0 bei 1-9)

Daten in der Testtabelle
id datum
1 05.12
2 17.03
3 17.03
4 17.03
5 05.12
6 01.03
7 30.08
8 17.11

Script und SQL-Abfrage
Code:
<?php
require_once(config.inc.php);

$content = ;
$sql = SELECT count(id) AS c, LEFT(datum,2) AS datum FROM tbl_datum GROUP BY LEFT(datum,2) ORDER BY c DESC;
if($arr = $_DB->Execute($sql)) {
	while(!$arr->EOF) { 
		$content .= Anzahl: <b>. $arr->fields['c'] .</b><br>;
		$content .= Tag: <b>. $arr->fields['datum'] .</b><br><br>;
		$arr->MoveNext();
	}
}
echo $content;
?>

Ausgabe
Anzahl: 4
Tag: 17

Anzahl: 2
Tag: 05

Anzahl: 1
Tag: 01

Anzahl: 1
Tag: 30

Möchtest du die Sache noch ein wenig verschärfen und nur die Daten eines bestimmten Monats anzeigen, so kann das ganz einfach abgeändert werden.

Code:
<?php
$month = 3; // z.B. März
$sql = SELECT count(id) AS c, LEFT(datum,2) AS datum FROM tbl_datum WHERE RIGHT(datum,2) = . $month . GROUP BY LEFT(datum,2) ORDER BY c DESC;
?>

Ich hoffe es hilft dir ein wenig ;)


gruss conny
 
  • #3
Danke erstmal für deine Mühe.

Mh, das ist noch nicht ganz das, was ich wollte. Was ich - um mich jetzt an dein Beispiel da zu lehnen - ist, dann aus einem bestimmtem Bereich - sagen wir vom 17.03. - 05.12. den Tag rauszubekommen, an dem halt die meisten Eintragungen vorhanden sind. Also - bei deiner Testtabelle da sollte dann nur ausgeworfen werden, dass der 17.03. die meisten Eintragungen hat - und dann am Besten gleich noch, wieviele er hat.

Also: Nur der Tag mit den meisten Eintragungen und gleichnoch, wieviele es an diesem waren.


Um das ganze mal an dem festzumachen, was ich vorhabe:
Ich hab' vor, mir eine Art Counter zu basteln - allerdings in Form eines Graphen (mit GD2). (passt ja alles so weit - bestimmte Daten nehmen, und dann den Graphen damit zeichnen) Ich bräuchte nur einen bestimmten Richtwert (sprich den größten Wert) um die restlichen Koordinaten zu berechnen.

Ich hoff', das war nun ganz klar und sofort verständlich. *Übermüdet dreinguck* *g


Danke, wenn jemandem noch was passendes einfällt. :D

Greets, rabies.
 
  • #4
So ich hab da mal ein bisschen rumgefrickelt und eine (wahrscheinlich eher unschöne) Lösung gefunden:

Code:
$res1 = mysql_query(CREATE TEMPORARY TABLE IF NOT EXISTS tmp_tbl (tmp_datum VARCHAR(6) NOT NULL, tmp_anzahl INT NOT NULL, PRIMARY KEY (tmp_datum))) or die(FEHLER in Zeile .__LINE__.<br>.mysql_error());
$res2 = mysql_query(REPLACE INTO tmp_tbl(tmp_datum, tmp_anzahl) SELECT datum, count( * ) AS anzahl FROM datumzaehlen GROUP BY datum) or die(FEHLER in Zeile .__LINE__.<br>.mysql_error());
$res3 = mysql_query(SELECT * FROM tmp_tbl ORDER BY tmp_anzahl DESC LIMIT 1) or die(FEHLER in Zeile .__LINE__.<br>.mysql_error());
$tmp=mysql_fetch_array($res3);
echo Der Tag mit den meisten Einträgen ist der .$tmp[tmp_datum]. (.$tmp[tmp_anzahl]. Einträge);

Meine Testtabelle (heisst datumzaehlen) hat 2 Spalten, einmal eine ID mit einem AUTO_INCREMENT Wert, der aber nicht weiter wichtig ist. Außerdem ein VARCHAR(6) in dem das Datum in der Form TT.MM. abgespeichert sind. Die Datensätze sind folgende:
Code:
ID DATUM
1  06.03.
2  03.03.
3  05.03.
4  06.03.
5  07.03.
6  04.03.
7  04.03.
8  06.03.

Mit
Code:
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_tbl (tmp_datum VARCHAR(6) NOT NULL, tmp_anzahl INT NOT NULL, PRIMARY KEY (tmp_datum))
wird eine temporäre Tabelle erzeugt, die lediglich ein VARCHAR(6) (für das Datum) und ein INT(11) (für die Anzahl der Aufrufe an diesem Datum) hat. IF NOT EXISTS dient hier nur um einen Fehler zu vermeiden, falls MySQL versucht, die temporäre Tabelle zu erstellen, obwohl sie momentan schon vorhanden ist. Temporäre Tabellen werden wieder entfernt, sobald die Verbindung zur DB geschlossen wird.

Mit
Code:
REPLACE INTO tmp_tbl(tmp_datum, tmp_anzahl) SELECT datum, count( * ) AS anzahl FROM datumzaehlen GROUP BY datum
füge ich die Werte, die sich aus dem SELECT ergeben, in die temp. Tabelle ein.

Mit
Code:
SELECT * FROM tmp_tbl ORDER BY tmp_anzahl DESC LIMIT 1
hole ich mir den Datensatz mit dem größten Wert in der tmp_anzahl-Spalte...

Testausgabe:
Code:
echo Der Tag mit den meisten Einträgen ist der .$tmp[tmp_datum]. (.$tmp[tmp_anzahl]. Einträge);
liefert
Der Tag mit den meisten Einträgen ist der 06.03. (3 Einträge)

Hoffe, dass es in etwa das ist, was dir vorschwebt.

M.
 
  • #5
*Vor Freude im Kreis spring*

Danke dir Michael_B, auch, wenn die Lösung nicht unbedingt den Schönheitspreis gewinnt. *g* Aber es bringt genau die Ausgabe, die ich brauche. :)
Und was dazugelernt hab' ich auch gleich noch - war mir bisher nicht bekannt, dass es sowas wie temporäre Tabellen gibt.

Danke auch an andere Leute, die sich->n Kopf über mein Problem gemacht haben.

Greets,
rabies
 
  • #6
@Peter Martin,

dein Beitrag ist jetzt hier =>

gruss conny
 
Thema:

MySQL: Denkblockade bei Count() und Max()

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben