Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
27.04.2006, 00:37
K-Putt



Der Titel klingt leider einfacher als die Situation ist.
Werd mal versuchen, das ganze so simpel wie möglich darzustellen:

Tabelle wb_threads:
Quellcode:id INTEGER,
name VARCHAR(250)
Angenommener Inhalt:
INSERT INTO wb_threads (1, 'Testthread 1');
INSERT INTO wb_threads (2, 'Testthread 2');

Tabelle wb_posts:
Quellcode:id INTEGER,
thread_id INTEGER,
timestamp INTEGER,
text TEXT
Angenommener Inhalt:
INSERT INTO wb_posts(1, 1, 10, 'Testpost 1');
INSERT INTO wb_posts(2, 1, 15, 'Testpost 2');
INSERT INTO wb_posts(3, 2, 20, 'Testpost 3');
INSERT INTO wb_posts(4, 2, 25, 'Testpost 4');

Nun die soll-Situation: Durch ein einzelnes Query möchte ich alle Threads auslesen, und möchte sie nach ihrem neuesten Beitrag, also dem Eintrag in der Tabelle wb_posts mit dem höchsten Wert für "timestamp", sortieren.

Klingt einfach, ist es aber nicht.
Das "witzige" an der Situation ist, dass das Query sowohl unter MySQL als auch unter Postgres funktionieren soll.
Postgres unterstützt Sub-Selects, darum funktioniert das hier:

Zitat:
SELECT DISTINCT
t.id, (SELECT MAX(timestamp) FROM wb_posts P WHERE p.thread_id=t.id) AS timestamp
FROM
wb_threads t, wb_posts p
WHERE
p.thread_id=t.id
ORDER BY
timestamp DESC
MySql unterstützt bis zur Version 4.1 allerdings keine Sub-Selects, darum muss ich das Query so umschreiben, dass auch MySQL damit klarkommt.

Verwende ich jetzt allerdings diese Abfrage hier:

Zitat:
SELECT
t.id,t.name,p.timestamp
FROM
wb_threads t
LEFT OUTER JOIN
wb_posts p ON p.thread_id=t.id
WHERE
t.forum_id=1
ORDER BY
p.timestamp
bekomme ich zwar die Timestamps aus der Post-Tabelle, allerdings bekomme ich einen Datensatz für jeden einzelnen Post in der Post-Tabelle.
Würde mit den obigen Beispieldaten dann so aussehen:
Zitat:
id | name | timestamp
1 - Testthread 1 | 10
1 - Testthread 1 | 15
2 - Testthread 2 | 20
2 - Testthread 2 | 25
Das will ich natürlich nicht haben - jeder Thread soll in der Übersicht maximal einmal vorkommen, und für jede Zeile soll eben der maximale zugehörige Timestamp aus der Post-Tabelle her.

Natürlich hab ich auch dran gedacht, die Ergebnisse einfach per GROUP BY zu gruppieren - funktioniert nur leider nicht, weil alle Werte, die im SELECT vorkommen, auch im GROUP BY vorkommen müssen - und dadurch wird natürlich nix mehr gruppiert, weil jeder Timestamp dafür sorgt, dass jede Zeile anders ist, und nicht gruppiert werden kann.

An dem Problem beiß ich mir nun schon seit Stunden die Zähne aus, es muss doch möglich sein, das mit einem einzelnen Query sauber zu implementieren...hat jemand einen Tipp für mich?

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
001
27.04.2006, 12:30
theDon



Quellcode:SELECT t.id, t.name, MAX( p.timestamp ) AS ts
FROM t
LEFT OUTER JOIN p ON t.id = p.thread_id
GROUP BY t.id
ORDER BY ts DESC

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
002
27.04.2006, 15:22
K-Putt



Du bist mein neuer Gott, danke vielmals.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche