MySQL: Daten mit Gültigkeit auslesen (GROUP BY ?)

Mikey

Mitglied
Hallo erst einmal...
Ich kriesel seit Tagen an folgendem Problem und würd das mal gerne ausdiskutieren...

Ich habe Daten mit Gültigkeit vorliegen, Beispiel (vereinfacht):
Code:
 ID | gueltig_ab | werte
----+------------+------
001 | 2000-01-01 | wert1 
001 | 2002-01-01 | wert2 
001 | 2005-01-01 | wert3
002 | ....

Nun möchte ich nur die Werte (pro ID) haben, die aktuell sind, im Beispiel also wäre das (u.a.) wert2.
Code:
SELECT DISTINCT *
FROM tabelle
WHERE gueltig_ab<CURDATE() 
ORDER BY ID, gueltig_ab desc;

Das ist mein letzter Stand, der mir allerdings wert1 und wert2 zurückgibt (wobei wert1 ja nicht gewünscht ist)

Mit GROUP BY ID bekomme ich nur den ersten Treffer (hier: wert1) zurück. Ich kann aber nicht wissen, in welcher Reihenfolge die Werte in der Tabelle abgelegt sind.
Ich würde theoretisch folgendes machen, was aber nicht funktioniert ("falsche Verwendung der GROUP-Funktion"):

Code:
SELECT *
FROM tabelle
WHERE gueltig_ab<CURDATE() AND gueltig_ab=MAX(gueltig_ab)
GROUP BY ID;

Langsam raucht mir ganz schön der Schädel, nachdem ich unzählige Beiträge durchforscht und nix gefunden habe :confused:

Ich nehme alle konstruktiven Vorschläge dankend an!
Micha
 
Wenn du eine neuere mySQL Version hast wäre es mit einem Subselect ganz einfach.
Kann es leider nicht testen da ich übrehaupt kein mySQL mehr habe aber hier mal ein Ansatz:

Code:
SELECT t.id, werte, t.gueltig_ab
FROM tabelle t,
   (  SELECT ID, MAX(gueltig_ab) as gueltig
     FROM tabelle
     GROUP BY id  ) subs
WHERE t.gueltig_ab = subs.gueltig
AND  t.id = subs.id
 
Zuletzt bearbeitet:
Exceptionfault hat gesagt.:
Wenn du eine neuere mySQL Version hast wäre es mit einem Subselect ganz einfach.
Hmm, sieht grundsätzlich erst mal sehr vielversprechend aus! Habe 4.0, Subs gehen m.E. erst ab 4.1 ?! Muss jetzt erst mal mein mySQL updaten und dann ausprobieren. (Bin glücklicherweise für das Zielsystem verantwortlich, kann also theoretisch jede beliebige Serverversion voraussetzen).

Ergebnisse folgen....
 
Hallo Exceptionfault,

danke für Deien Tipp - das war genau der Trigger, den ich brauchte! :)

Nach einer langen Nacht (die Umstellung auf MySQL 4.1 Gamma (!) war nicht so reibungslos wie die Installationen zuvor) habe ich nun meine Lösung drumherumgebastelt.
Der Vollständighalber möchte ich die hier präsentieren, für alle, die eine ähnliche Lösung suchen.

Um doch die Abwärtskompatibilität zu wahren, habe ich auch eine Alternativlösung mittels TEMPORARY TABLE entwickelt.

Variante mit Subs für MySql >= 4.1:
Code:
SELECT *
  FROM artikel a,
	( SELECT ID, MAX(gueltig_ab) as gueltig
		FROM artikelpreise
		WHERE gueltig_ab<CURDATE()
		GROUP BY id ) subs
  LEFT JOIN artikelpreise ap USING (ID)
  WHERE ap.gueltig_ab = subs.gueltig
	 AND a.id = subs.id;

Variante ohne Subs für MySql < 4.1:
Code:
CREATE TEMPORARY TABLE subs
  SELECT ID, MAX(gueltig_ab) as gueltig
	 FROM artikelpreise
	 WHERE gueltig_ab<CURDATE()
	 GROUP BY id;
 
SELECT a.*, ap.preis , ap.gueltig_ab
  FROM artikel a
  LEFT JOIN artikelpreise ap USING (ID)
  LEFT JOIN subs USING (ID)
  WHERE ap.gueltig_ab = subs.gueltig;
 
.
.
.
 
DROP TABLE subs;

Das ist jetzt der vollständige Code; in der ersten Tabelle artikel sind die Texte usw., in der zweiten artikelpreise die gesuchten Daten mit Gültigkeit.

Ich denke, dass ich erst mal die abwärtskompatiblere Variante bevorzugen werde. Oder hat jemand bezüglich der Performance wertvolle Tipps? Ich denke mal, dass die Subs intern eh über temporäre Tabellen realisiert werden, so dass es performance-technisch keinen großen Unterschied geben sollte ?!

Danke nochmal,
Micha :)
 

Neue Beiträge

Zurück