Axel Richter: SQl-Abfrage vereinfachen

Beitrag lesen

Hallo,

Wenn die Seite mit der ID=x ausgeliefert wird lautet der SQL-Query:

SELECT * from rt_versionen LEFT JOIN mt_seiten ON mt_seiten.ID = rt_versionen.SEITEN_ID WHERE mt_seiten.ID = x && rt_versionen.PUBLTIME < NOW() ORDER BY PUBLTIME LIMIT 1;

^ Hier bekommst Du aber den kleinsten (ältesten) Wert für PUBLTIME. Ist das so gewollt?
Bitte ersetze den * durch die Spaltenbezeichner, die Du _wirklich_ benötigst.

Sagen wir ich brauche die Seiten mit den IDs 4,10,18 und 24.

SELECT mt_seiten.ID, mt_seiten.NAME, tr_versionen.INHALT, rt_versionen.PUBLTIME
FROM rt_versionen LEFT JOIN mt_seiten ON mt_seiten.ID = rt_versionen.SEITEN_ID
WHERE (mt_seiten.ID = 4 OR mt_seiten.ID = 10 OR mt_seiten.ID = 18 OR mt_seiten.ID = 24) AND rt_versionen.PUBLTIME < NOW() ORDER BY mt_seiten.ID, rt_versionen.PUBLTIME;

oder

SELECT mt_seiten.ID, mt_seiten.NAME, tr_versionen.INHALT, rt_versionen.PUBLTIME
FROM rt_versionen LEFT JOIN mt_seiten ON mt_seiten.ID = rt_versionen.SEITEN_ID
WHERE mt_seiten.ID IN (4,19,18,24) AND rt_versionen.PUBLTIME < NOW() ORDER BY mt_seiten.ID, rt_versionen.PUBLTIME;

ergibt ein Resultset mit den gewünschten mt_seiten.IDs, deren rt_versionen.PUBLTIME vor jetzt liegt. Dieses ist aufsteigend sortiert nach mt_seiten.ID und innerhalb der mt_seiten.ID nach PUBLTIME. Dadurch steht der älteste Eintrag je mt_seiten.ID immer am Anfang der jeweiligen mt_seiten.ID. Etwa so:

mt_seiten.ID   rt_versionen.PUBLTIME
4              21.12.2004
4              05.01.2005
19             10.12.2004
19             15.12.2004
19             01.01.2005
...

Mit Hilfe einer Programmiersprache kannst Du nun dieses Resultset entsprechend auswerten.

viele Grüße

Axel