• 26.08.2025, 23:25
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

wintermute

Junior Member

MySQL abfrage problem

Donnerstag, 11. Januar 2007, 15:42

hallo,

ich habe gerade folgendes Problem:
Ich habe eine Tabelle die die Felder "datum" und "ereignis" enthält.
Darin werden (wie die Namen schon erahnen lassen *g*) Ereignisse mit den jeweiligen daten gespeichert. Z.b. "1.1.2006" "ereignis1", "3.4.2006" "ereignis", "5.6.2006" "ereignis3", etc.pp

Und nu kommt mein Problem:
ich hätte gerne eine Abfrage die die ereignise der nächst vorhandenen 4 Monate ausgibt.
In dem Beispiel also die vom Januar, März und Juni. Da es keine im Februar, april und mai gibt.

Am liebsten wäre mir eine reine SQL lösung.
ich möchte also nicht in php von mir aus, eine while schleife haben, die einfach die monate nacheinander durchgeht, bis sie maximal 4 monate gefunden hat.

durch ein bissl rumgesuche bin ich bei mysql auf eine While schleife gestoßen, mit if wäre also ein solches Konstrukt vermutlch möglich. Allerdings auch nur unter mysql.version >= 5.x

Kann man sowas auch für mysql 4 erstellen? Oder unter mysql 5 unter zuhilfename von while oder repeat und konsorten?

Für denkanstöße oder lösungswege wäre ich echt dankbar :)
MfG Wintermute

crushcoder

God

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 16:10

also normal sollte das auch ohne while und if zu lösen sein, allein durch sql.

gibt es die datenbank mit den daten schon?
welches format haben die datums-daten in der datenbank?

normalerweise nimmt man für ein datum gerne einen "timestamp", dann kann man im sql "datum BETWEEN xxx AND yyy" benutzen (für die genaue syntax gebe ich keine garantie, aber vom sinn her sieht das so aus).
das geht auch wenn es ein "date" in der datenbank ist, wobei die umrechnung in php manchmal komisch ist.

wenn du allerdings das datum als "varchar" (= zeichenkette) gespeichert hast geht das nicht so einfach.
das wäre auch sehr unschön.
Gott hat die Welt ja nur in sieben Tagen erschaffen können, weil es keine installierte Basis gab.

wintermute

Junior Member

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 16:29

Es gibt die tabelle zwar schon, allerdings nicht im produktiven Einsatz ;)
Datum wird als date gespeichert, ereignis als varchar(spielt hier aber eh keine rolle *g*).
Ich habe mich extra für date entschieden, um sachen wie Date_Add(), Date_Sub(), etc, zu verwenden. Finde ich persönlich angenehmer als mit Timestamps zu werkeln, aber jeder hat da ja seine Vorlieben ;)

Das between gibt es, das ist richtig, erfüllt aber den zweck leider nicht so, wie ich es mir wünsche.
Wenn ich z.b. im jan, feb, mär und jun ereignisee habe, würde ein between aktuellermonat and monat+4 die ereignisse aus jan, feb, mär ausgeben, der jun soll aber eigentlich noch ausgegeben werden.

Das problem an der Sache ist, das ich vorher nicht weiß, in welchen Monaten ereignisse sind und in welchen nicht.
Eine 2te tabelle oder ein zusatzfeld um dies zu "merken" möchte ich ehrlich gesagt nicht.
Das ist auch eher ein Problem das ich aus ehrgeiz lösen möchte nach der Suche auf der für mich besten Lösung.
Natürlich könnte ich z.b. in php machen

$monat_des_spaetesten_ereignises = mysql(hole monat)
$monate = 0;
$aktmonat = aktueller_monat();
while($monate < 4 && $akt_monat <= $m_d_s_e){
if(hole_ereignisse($aktmonat) == leer)
$akt_monat++
else
$monate++
}

jetzt mal leicht skiziert und sicher fehlerhaft auf die schnelle ;)
Jetzt reizt es mich aber wirklich eine reine und "schöne" sql lösung zu finden.

MfG Wintermute

crushcoder

God

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 17:15

ah, so, normal kommen hier doch eher anfängerfragen, da schießt man schon mit standardantworten damit es klarer wird.

das ist schon interessanter.

ob timestamp oder date kommt halt immer drauf an, timestamps sind zb weniger abhängig von der datenbank (falls man mal migrieren möchte).

ich denke man könnte ein group-by auf den monat machen, mit count die ereignis-anzahl rausfinden (also so dass pro group/monat nur eine zeile rauskommt mit der anzahl der ereignisse), dabei ein limit von 4 groups.
dies dann als subquery, wobei die summe der ereignis-summen dann wiederum das limit für die hauptquery wäre.

ich hoffe man kann das nachvollziehen.

das wären dann wohl ein paar subqueries und funktionen zu schreiben, ob das wirklich schöner wird als ein wenig php mag ich bezweifeln.
Gott hat die Welt ja nur in sieben Tagen erschaffen können, weil es keine installierte Basis gab.

hurra

God

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 17:33

Hm, kannst du das nicht mit "LIMIT 4" auf 4 Ergebnisse limiteren, dann noch nach datum groupen und nach datum sortieren?

crushcoder

God

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 17:41

bei einem einfachen group by werden, wie vorher, alle datensätze ausgegeben, nichts zusammengefasst.

man bekäme also nur die 4 ersten ereignisse, auch wenn im ersten monat 20 ereignisse anliegen.
Gott hat die Welt ja nur in sieben Tagen erschaffen können, weil es keine installierte Basis gab.

wintermute

Junior Member

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 18:23

Ja, dein Lösungsvorschlag ist nachvollziehbar.
Einen ähnlichen Ansatz hatte ich auch schon in Gedanken nur ohne die Subquery, hab den aber wieder verworfen, da man ja nicht nur nach Monaten, sondern auch nach Jahren ein groupby machen muss.
Werd mir deinen Vorschlag mit den Subquerys mal durch den Kopf gehen lassen und gucken ob man daraus was stricken kann.

Auf das schreiben von Funktionen wollte ich eigentlich verzichten, dann lieber in php machen, wobei ja MySQL um einiges schneller ist bei der ausführung.
Mal schauen, vllt krieg ja einer hier noch den Geistesblitz überhaupt ;-)
Der Nachteil bei einer PHP lösung wäre, das relativ viel vermeidbarer Overhead entsteht.

MfG Wintermute

wintermute

Junior Member

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 19:05

Heul ohh nein :(
Verdammt, ich bin zu so einer schönen Lösung gekommen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
SELECT id, datum, ereignis
FROM `termin_test`
WHERE date_format( datum, '%Y-%m' )
IN (
  SELECT date_format( datum, '%Y-%m' )
  FROM `termin_test`
  WHERE datum > date_format( curdate( ) , '%Y-%m-01' )
  GROUP BY date_format( datum, '%Y-%m' )
  LIMIT 0 , 4
)
ORDER BY datum


Fehler: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Gnargs. Fällt einem zufällig ne clevere Lösung ein?
MfG Winermute

Edit: Mit nem kleinen Trick geht's :) THX @crushcoder :)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
SELECT datum, ereignis
FROM `termin_test`
INNER JOIN
(
  SELECT date_format(datum, '%Y-%m') AS TMP_DATE
  FROM `termin_test`
  WHERE datum > date_format(curdate(), '%Y-%m-01')
  GROUP BY date_format(datum, '%Y-%m')
  LIMIT 0,4
) AS TMP_TABLE
WHERE date_format(datum, '%Y-%m') = TMP_DATE
ORDER BY datum

Chrizzz

Senior Member

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 20:06

Du kannst auch mit einem Substring bei mysql arbeiten. Dann kannst du sowohl ein order by, ein distinct und ein limit verwenden. Die Abfrage an sich wäre dann auch einfacher als oben genannte lösung
Signatur out of date...

wintermute

Junior Member

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 20:11

Auf die schnelle hab ich jetzt nur gefunden, das Substring bei MySQL genauso funktioniert wie in anderen mir geläufigen sprachen, und zwar:
SUBSTRING("test",2,3) => es.
Wie mir das helfen kann, versteh ich gerade nicht :(
Wäre net, wenn du das Query mal grob angleichen könntest, muss net 100% stimmen, nur damit ich so den grundgedanken dahinter verstehe..

Der Limit fehler trat auf, da Limit in subqueries leider noch net unterstützt wird :(
Deswegen muss man sich mit dem erstellen einer virtuellen tabelle begnügen..

MfG Wintermute

edit:
oder meinst du ein SUBSTRING(datum,0,7)? anstatt dem date_format?

crushcoder

God

Re: MySQL abfrage problem

Donnerstag, 11. Januar 2007, 20:56

ja cool, das ist ja doch übersichtlicher geworden als ich dachte.
Gott hat die Welt ja nur in sieben Tagen erschaffen können, weil es keine installierte Basis gab.