MySQL: Denkblockade bei Count() und Max()

Dieses Thema MySQL: Denkblockade bei Count() und Max() im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von lamerc0w, 6. Apr. 2005.

Thema: MySQL: Denkblockade bei Count() und Max() Hi, Ich hab' hier->n paar Datensätze mit datum (jeweils Tag.Monat. (Bsp.: 06.04.)) und möchte gern wissen,...

  1. 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
    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
    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
    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 => http://www.wintotal-forum.de/index.php?topic=78925.msg418954#msg418954

    gruss conny
     
Die Seite wird geladen...

MySQL: Denkblockade bei Count() und Max() - Ähnliche Themen

Forum Datum
Versionsprobleme mit der "mysql.dll" (32 und 64bit) Windows 7 Forum 28. Juni 2016
Mysql-Zugriff via batch Webentwicklung, Hosting & Programmierung 16. Okt. 2014
Automatisierte MySQL Backups erstellen Windows XP Forum 28. Aug. 2012
iis7 verträgt sich nicht mit mysql Windows XP Forum 2. Aug. 2012
Programmierer (PHP/MySQL) für WinTotal gesucht! Windows XP Forum 20. Mai 2012