[MySQL] SELECT und ORDER BY über 2 Tabellen

tobias1985

Der Erlöser
ID: 37913
L
24 April 2006
4.963
607
Hi,
hab zurzeit ein kleines Problem. Ich komm nicht drauf wie ich folgendes Problem lösen kann:

Tabelle1: id, text, timestamp
Tabelle2: text, timestamp, tabelle1id

Die Texte aus Tabelle2 gehören also zu verschiedenen Texten aus Tabelle1.
Ich möchte nun die Texte aus Tabelle1 ausgeben, sortiert nach dem neusten zugehörigen Timestamp der Tabelle2. Wenn in Tabelle2 kein Eintrag ist, sortiert nach dem timestamp der Tabelle1.

Im Prinzip soll das gleiche wie in einem Forum erreicht werden.
Im Forum stehen ja die neusten Threads oben oder eben die Threads, in denen zuletzt gepostet wurde.
Vom Prinzip her also genau das, was ich erreichen möchte.

Gibt es dafür eine Lösung oder ist es sinnvoller ein weiteres Feld in Tabelle1 einzufügen "letzteaktion_timestamp" welches dann immer aktualisiert wird?
 
Das müsste etwa so funktionieren:
Code:
SELECT t1.id, t1.text,
  IFNULL ( t2.timestamp, t1.timestamp ) AS time_stamp
FROM table1 t1
LEFT JOIN table2 t2
ON (t1.id = t2.id)
ORDER BY time_stamp DESC

[edit]

Geht dank IFNULL() sogar etwas kürzer.
 
Zuletzt bearbeitet:
je nach verwendungs zwecks ists aber wahrscheinlich besser wirklich ne neue spalte anzufügen... weil wenn hier viel datensätze vorhanden sind wirds lahm.
 
Hm vermutlich werd ichs so machen, wie ZeroCCC geschrieben hat, weils vermutlich weniger die DB belastet.

@tleilax: Irgendwie funktioniert das nicht:

PHP:
$select_threads = mysql_query('SELECT forum_threads.id,forum_threads.titel,forum_threads.stamp, IFNULL ( forum_posts.stamp, forum_threads.stamp ) AS time_stamp FROM forum_threads LEFT JOIN forum_posts ON (forum_threads.id = forum_posts.id) WHERE katid="'.$_GET['id'].'" ORDER BY time_stamp DESC');
while(list($id,$titel,$stamp)=mysql_fetch_row($select_threads)){
}

Warning</B>: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /.../module/forum/view_kat.php on line 13
 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '( forum_posts.stamp, forum_threads.stamp ) AS time_stamp FROM forum_threads LEFT' at line 1

EDIT: wenn ich forum_threads.katid mache, kommt der gleiche Fehler. Daran liegts nicht.
Ist nur die Frage obs so Sinn macht oder obs mit zusätzlichem Feld sinnvoller ist.
Weil der select wird jedes mal gemacht, wenn sich jemand im Forum bewegt. Aber über ein neues Feld muss nur einmal beim erstellen eines Posts ein update gemacht werden.
 
Wenn Du die Tabellen noch umstricken willst, mach das. Schaden kann's ja nicht.

Der Fehler rührt sonst scheinbar einzig und allein daher, dass Du und ich ein Leerzeichen nach dem IFNULL stehen haben. Das mag MySQL scheinbar nicht. Mea culpa.
 
Stimmt, der Fehler ist weg. Das Ergebnis ist aber das gleiche wie mit meinem alten normalen select.
Trotzdem danke. Ich werde dann einfach ein weiteres Feld in der Thread-Tabelle einfügen, welches dann bei jedem Beitrag im Thread aktualisiert wird.