MySQL : Abfrage aller DS des aktuellsten Monats in DB

shredder01

Mitglied
Hallo,
ich bin seit einer Weile damit beschäftigt die, bisher statische, Webseite eines Basketballvereins etwas dynamisch zu machen. Was hauptsächlich bedeutet, das ich Sachen, die sich öfters ändern, nicht mehr fest im HTML-Code habe, sondern sie mittels PHP aus 'ner MySQL-Datenbank hole. Die Veränderungen werden mit einem über den Browser zu bedienenden Editor vorgenommen.
Ok, soweit sogut. Inzwischen ist das Ganze auch fast fertig bis auf eine Sache an der es jetzt hängt. Der Verein digitalisiert alle Zeitungsmeldungen, die über ihn erscheinen. Die jeweils aktuellsten sollen auf der Startseite erscheinen, der Rest soll unter einem Link Archiv aufgerufen werden können. So, das Problem habe ich jetzt mit der Formulierung der SELECT-Anweisung für die Startseite. Auf der Startseite sollen also die Zeitungsmeldungen des Monats erscheinen, der dem aktuellen Datum am nächsten ist. Bspw. wenn im Mai 2007 eine Meldung abgespeichert wird und dann erst wieder im September 2007 eine, soll von Mai bis zur Abspeicherung der neuen die Mai-Meldung erscheinen. Falls aber im Mai zwei oder drei Zeitungsmeldungen abgespeichert wurden sollen auch zwei oder drei bis zum September auf der Startseite erscheinen.
Ich hab erstmal mit folgendem angefangen (was mich natürlich bei mehr als einer Zeitungsmeldung noch nicht an mein Ziel bringt) :
Code:
SELECT * FROM newspaper WHERE date <= CURDATE() ORDER BY date DESC LIMIT 1
Dann hab ich noch versucht das Ganze mit 'ner Subquery, die Monat und Jahr des letzten Datensatzes ermitteln sollte, zu lösen. Aber da bekam ich dann leider eine Meldung das meine MySQL-Version ein LIMIT in Subquerys nicht unterstützen würde.
Vielleicht hat ja jemand eine Idee, wie ich das was mit obigem Code bei einem Datensatz klappt auch bei zwei oder mehr Datensätzen pro Monat umgesetzt bekomme.
Danke schonmal.
shredder01
 
Versuche mal so, jedoch keine Garanntie :)

select * from newspaper
where convert(varchar(4),date,12) =(select convert(varchar(4),max(date),12) from newspaper)

Also alle DS, bei denen das Datum im Format yymm gleich der letzten Datum im selben Format.
 
Hi,

Du solltest dir zuvor einen Zeitraum definieren der für die Abfrage einbezogen wird.
Hängt jetzt von deinen Spaltentypen ab.
Ich gehe mal davon aus, dass der Typ vom Feld date DATETIME ist.

Den auszulesenden Zeitraum geben wir in Sekunden an:
PHP:
$time_range = 60*60*24*14; // 14 Tage

Jetzt müßen wir nur noch im SQL-Querry das Feld "date" in einen Timestamp formatieren.
PHP:
SELECT * FROM newspaper WHERE TIMESTAMP(date)+$time_range >= NEW TIMESTAMP() ORDER BY date

Bin mir beim Syntax nicht mehr ganz sicher, falls was nicht klappt nochmal melden :)

Gruß tyg3r
 
Erstmal vielen Dank für die Antworten!

@Tyg3r : Hm einen Zeitraum zu definieren wird nicht gehen, das ist ja glaube ich gerade mein Hauptproblem. Ich weiß ja nicht wie oft etwas über den Verein in der Zeitung erscheint. Und auf der Startseite sollen eben immer die Artikel des letzten verfügbaren Monats angezeigt werden. Also er soll gucken von welchem Monat die letzte Meldung in der Datenbank ist und dann schauen, ob es weitere Meldungen von diesem Monat gibt. Ich verwende übrigens als Datentyp DATE.

@musor : Ich versuch gerade zu verstehen was du mit dem CONVERT() machst (irgendwie hat mir dabei das was die Doku darüber schreibt auch nicht weiterhelfen können :confused:) ... aber deine Subquery mit dem MAX(date) hat mich auf 'ne Idee gebracht. Das was du mit MAX(date) machst hab ich ja mit LIMIT 1 in der Subquery versucht (aber wegen LIMIT bekam ich ja 'ne Fehlermeldung). Vielleicht löst das ja mein Problem schon.

Gruß shredder01
 
Also dann ist es doch einfach...

Du willst nur die Ergebnisse de aktuellen Monats?
Dann so:

SELECT * FROM newspaper WHERE MONTH(date) = MONTH(NOW()) ORDER BY date

Bei MONTH(NOW()) bin ich nicht ganz sicher, eventuell nur MONTH()
oder einfach mit PHP:
WHERE MONTH(date) = '".date("m")."'

Mit MONTH(date) extrahierst du den Monat aus date.

Gruß tyg3r
 
@Tyg3r : Nee leider nicht des aktuellen Monats, sondern des aktuellsten, der NICHT unbedingt mit dem aktuellen übereinstimmen muß.
Das Problem ist ich kann nicht im voraus sagen von welchem Monat die Artikel stammen die angezeigt werden sollen, nur das jeweils die aktuellsten genommen werden sollen. Aber die können im Extremfall eben auch von vor 6 Monaten oder so sein (wenn zwischendurch nichts über den Verein in der Zeitung stand).
Und als zweites Problem weiß ich auch nicht wieviele Artikel von dem fraglichen Monat in der Datenbank sind. Das kann bloß einer sein oder aber auch mehrere (weil der Verein so'n tolles Spiel geliefert hat und mehrere Zeitungen was berichtet haben, oder was weiß ich :)).
Hm, ich überlege gerade wie ich alle DS, die dasselbe Jahr und denselben Monat wie MAX(date) haben herausfiltern kann. Wenn ich nur den Monat vergleichen lasse, kramt er mir auch Sachen vom Vorjahr usw. heraus und wenn ich mit dem kompletten MAX(date) vergleiche kramt er natürlich nur den letzten DS heraus.:suspekt:

Habe das Problem inzwischen gelöst bekommen. Die seligmachende Formel war :
Code:
SELECT * FROM newspaper WHERE DATE_FORMAT(date, '%Y%m') = (SELECT MAX(DATE_FORMAT(date, '%Y%m')) FROM newspaper)
:)
Leider bin ich nicht alleine drauf gekommen.:(
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück