Galerien in Datumskategorien unterteilen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
phillip
Mitglied
Beiträge: 933
Registriert: 20.03.2005 12:00

Galerien in Datumskategorien unterteilen

Beitrag von phillip »

Hallo zusammen

Ich würde gerne Gallerien aus meiner MySQL Datenbank auslesen, sortiert und dargestellt nach dem Datum.
Wie ich mir das vorstelle:

Screenshot

Leider stehe ich hier mit meinen SQL Kenntnissen an. Ist dies in einer Abfrage überhaupt möglich?

Bis Jetzt sieht meine Abfrage soweit so aus, was auch gut funktioniert:

Code: Alles auswählen

$sql = "SELECT c.*, g.*, l.*, e.*
            	    FROM gallery_cat as c, gallery as g, location as l, events as e
		    WHERE c.gallery_cat_event_id = e.event_id AND e.event_location = l.location_id AND c.gallery_cat_pic = g.gallery_id AND c.gallery_cat_active = 1
		ORDER BY gallery_cat_date DESC LIMIT 9;";
Aber wie kann ich die Einträge in diese Datumskategorien darstellen?

Die Datumsformatierung sieht so aus:

Code: Alles auswählen

2009-12-01 23:07:35
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Galerien in Datumskategorien unterteilen

Beitrag von gn#36 »

Das Datum kannst du mit DATE_FORMAT formatieren (Alle mysql Datums- und Zeitfunktionen findest du hier).

Die Darstellung kannst du natürlich nicht mit SQL alleine machen. Du kannst die Daten lediglich vorsortieren und musst dann eben in deinem Skript darauf achten die Sortierung zu gewährleisten. Dazu benutzt du zum Beispiel eben DATE_FORMAT um dir das Datum formatiert liefern zu lassen und prüfst in deinem Skript ganz einfach, ob das Datum das gleiche ist wie bei dem vorher ausgegebenen Datensatz. Ein minimalistisches Beispiel wäre sowas:

Code: Alles auswählen

$sql = 'SELECT daten, DATE_FORMAT('%d.%m.%Y', datum) as f_datum FROM tabelle ORDER BY datum DESC';
$result = mysql_query($sql) or die(mysql_error());
$alt = '';
while($row = mysql_fetch_assoc($result))
{
if($row['f_datum'] != $alt)
{
echo 'Krams für neues Datum ausgeben';
$alt = $row['f_datum'];
}
echo 'Krams innerhalb der Kategorie ausgeben';
//z.b.
echo $row['daten'];
}
mysql_free_result($result);
 
Was ich dir übrigens auch empfehlen würde ist zum einen, dass du nicht sämtliche Tabellenspalten von allen Tabellen holst wenn du nicht wirklich alle brauchst sondern das wirklich selektiv machst, denn erstens geht das schneller weil nicht unnötig Daten durch die Gegend geschickt werden und zweitens ist das günstiger wenn du deine Datenbank mal irgendwann erweitern möchtest, denn dann müsstest du vielleicht alte Skripte anpassen wenn du das so machst wie du es jetzt tust (wenn die z.b. mit Funktionen arbeiten, die alle Werte verarbeiten die du ausliest aber die neuen Werte z.b. nicht verarbeiten sollen).

Außerdem solltest du statt den N:N mappings zwischen den Tabellen die im Moment gemacht werden (in Form eines FULL JOINS) wenn du einfach von allen Tabellen gleichzeitig abfragst (jeder Wert von Tabelle a wird mit jedem von Tabelle b in jeder beliebigen Kombination in Erwägung gezogen, das Where schließt dann einige dieser Kombinationen aus) lieber ausnutzen, dass du nur bestimmte Datenkombinationen brauchst und z.b. stattdessen einen LEFT JOIN verwenden.
D.h. du legst eine primäre Tabelle fest von der du die Daten holst, alle anderen Tabellen bindest du per LEFT JOIN an und legst mittels ON fest, wie diese mit der primären Tabelle zusammenhängen. In der Regel gibt es ja zumindest eine Tabelle aus der du die Datensätze nicht mehrfach brauchst, diese kannst du dann als primäre Tabelle nutzen.

Als Beispiel:
Wenn du eine Fototabelle hast und dazu die User laden willst die diese Bilder eingestellt haben, dann kann ein User zwar mehrere Bilder hochladen, jedes Bild kann aber nur von einem User hochgeladen werden. In dem Fall nimmst du dann die Bilder als primäre Tabelle für deine Abfrage und bindest die Usertabelle per LEFT JOIN dazu (andersherum geht das zumindest mit dem LEFT JOIN nicht).
Dann würde so eine Abfrage z.b. so aussehen:

Code: Alles auswählen

SELECT u.userdaten, b.bilderdaten 
FROM bilder b
LEFT JOIN user u ON b.user_id = u.user_id
WHERE b.bedingung = 'erfüllt'
ORDER BY b.datum DESC
Das kannst du natürlich ganz ohne Probleme auf mehrere Tabellen im Join erweitern (auch die Abhängigkeiten im ON Teil müssen nicht zwingend Abhängigkeiten von der primären Tabelle sein), Beispiele dazu findest du überall im Internet wenn du einfach mal nach SQL JOIN oder MYSQL JOIN suchst.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“