sortieren/gruppieren - nach datum UND zeit!

GoLLuM

Erfahrenes Mitglied
Zur Übersicht:
Also ich hab mir sowas wie nen Tagebuch mit PHP und MySQL gebastelt. da kann man mehrere Einträge pro Tag schreiben. Das Datum und die Zeit liegen als DATE und TIME vor. Jetzt funktioniert alles wunderbar - Ausgabe nach Datum zu sortieren ist natürlich kein Problem (zumal ich auch noch ne auto_increment ID hab). Bis jetzt sortiert er es nach eben dieser ID und zwar DESC - klar, wenn die aktuellesten Einträge ganz oben stehen sollen.

mein Problem:
Ich möchte die Einträge gerne nach dem Tag zusammenfassen. also mal nen Beispiel:
Ich hab jetzt zwei einträge an einem Tag (z.b. von gestern 2004-08-24): der erste von "16:28:45" und der zweite von "14:33:50".

wie schaffe ich es nun, das er mir beide daten ausgibt, aber ich weiß an welchem datum das is?
hab schon mit GROUP BY probiert... aber das liefert mir ja nur EINE zeile... müsste cih das irgendwie mit zwei abfragen machen, oder muss ich dazu in meinem PHP-code ne Schleife durchlaufen lassen, und für jedes datum das es gibt, ne abfrage machen? das scheint mir doch etwas sehr umständlich. da muss es doch ne bessere/einfachere Lösung geben :)

danke schon mal
 
danke snuu... sowas hab ich mir auch schon gedacht. aber jetzt stellt euch mal vor, irgendwann sind da mehrere Hundert Einträge drin. Und es soll einfach alles angezeigt werden. dann dauert es doch ewig, alle möglichen Daten (mehrzahl von Datum) durchzugehen.

hab mich grade noch ma rangesetzt, und momentan sieht es so aus (als beispiel für alle datensätze die von gestern - 24.08. - sind) :
PHP:
mysql_query("SELECT *   FROM `blog`   WHERE DAYOFMONTH( datum ) = 24 AND MONTH( datum ) = 08  ORDER BY zeit DESC");

aber das kann doch nicht sein, das ich jetzt dann jedes erdentkliche datum durchgehen muss, oder etwa doch? :(
 
so, also entschuldigt den Doppelpost, aber ich denke so kann es für nachfolge Hilfesuchende verständlicher sein.

Ich habs jetzt hinbekommen. und zwar mit 2 Abfragen und 2 Schleifen. hier mein code:

PHP:
$dieser_monat = date("m");
$dieses_jahr = date("Y");
$where = "MONTH(datum) = $dieser_monat AND YEAR(datum) = $dieses_jahr";
$res = mysql_query("SELECT DISTINCT (datum) AS anzeige_datum FROM `blog` WHERE $where");
$num = mysql_num_rows($res);
for ($i=1;$i<=$num;$i++)
{
 $zeile = mysql_fetch_array($res);
 $anzeige_datum = $zeile["anzeige_datum"];
 echo "$anzeige_datum<br>";
 $res2 = mysql_query("SELECT * FROM `blog` WHERE datum = '$anzeige_datum' ORDER BY zeit DESC");
 $num2 = mysql_num_rows($res2);
 for ($j=1;$j<=$num2;$j++)
 {
  $zeile = mysql_fetch_array($res2);
  //htmlangaben zur ausgabe
 }

vielleicht kurz was zur Erklärung... also zuerst schaue ich, was wir für ein Jahr und Monat haben - weil ich immer nur die Einträge vom aktuellen Monat anzeigen lassen will. dann hol ich mir alle Einträge heraus die in dieses Kriterium passen (mit distinct bekommt man ja nur die verschiedenen Daten). naja, und dann in der zweiten Abfrage laß ich einfach alle Einträge vom jeweiligen Datum nach Zeit sortiert anzeigen. das is jetzt so die schnellste Lösung die mir eingfallen ist. wenn jemand noch ne bessere hat, kann er sie gerne berichten...
 
Geht nicht auch:

PHP:
SELECT * FROM table1
WHERE month LIKE 'Monatsname'
ORDER BY month
AND time;

oder

SELECT * FROM table1
WHERE month LIKE 'Monatsname'
ORDER BY month
ORDER BY time;

Eins davon meine ich müsste auch gehen. Oder du bastelst dein Script so, dass er immer für jeden Monat des Jahres eine Tabelle anlegt, dann hast du nicht eine große Tabelle, und kannst besser Backups machen.

PS: Monatsname habe ich jetzt gewählt, wenn man mit JAN, FEB, etc. arbeitet.


MfG Radhad
 
naja, bei deiner Lösung müsste ich das Datum ja "zerlegt" gespeichert haben. also den Monat in einem Feld und das Jahr usw... das hab ich aber nicht. sonder das ganze liegt in DATE und TIME Feldern vor. die lassen sich mit den von MySQL mitgelieferten DAYOFMONTH() MONTH() und YEAR() sehr gut durchsuchen.

wegen der zweiten Idee von wegen "Tabelle für jeden Monat speichern"... naja, das hatte ich auch überlegt. allerdings find ich das etwas zu umständlich. irgendwie gefällts mir in einer Tabelle besser. außerdem glaube ich, das diese Lösung nicht ganz so elegant und "programmiersauber" ist... ;)
 
Also, wenn ich mir das die verschiedenen NF's so anschaue, würde ich es gerade bei der relationalen Datenbank so aufbauen. Außerdem hat es einen ungemeinen Performance gewinn, wenn man immer nur noch 50 Datensätze statt 500 Datensätze abfragt! Also, ein sauberer Datenbankaufbau wäre pro Monat eine Tabelle in der DB.

@Lösung eins: das kann man ja deinen Variablen dementsprechend anpassen, war nur ein Beispiel.
 
Also, ein sauberer Datenbankaufbau wäre pro Monat eine Tabelle in der DB.
Das kann ich so nicht stehen lassen. Es ist entgegen den Sinn einer relationalen Datenbank mehrere Tabellen mit dem gleichen Aufbau zu erstellen, nur um die Daten anders aufzuteilen. Ob Du nun 50 Datensätze abrufst oder 500 ist der Datenbank ziemlich egal. Und ich behaupte sogar, dass man als Betrachter der Seite den Unterschied nicht merkt. Wenn man die Abfragegeschwindigkeit optimieren möchte, legt man einen Index über die Spalten, nach denen sortiert, gruppiert oder eingeschränkt wird.

snuu
 
Jo genau. So hatten wir das in der Schule auch gelernt. und jetzt sogar ncoh mal in der Uni. Normalisierung und so weiter spielt ja da ne große Rolle.

jetzt wollte ich grad ma fragen, das es denn bringt diese Indizes einzusetzen? kannst du vielleicht ma ganz kurz erklären wozu die gut sind, snuu? Wenn's hier zu arg offtopic is, dann schick mir doch einfach ne PN. dankeschön :)
 
Zurück