Die Frage die du dir stellen solltest ist: Was kommt raus und was sollte rauskommen?
Den zweiten Teil davon solltest du eigentlich ziemlich genau kennen: Du willst eine Liste der Usernamen, die schon in dem Thema gepostet haben. Da du Zugriff auf das Thema mit der ID 17 hast dürftest du dein Ergebnis kontrollieren können und feststellen, dass das so nicht zusammenpasst. Bei deiner ersten Abfrage bekommst du nur genau einen Benutzernamen, bei deiner zweiten bekommst du nur IDs, die du noch mit einem Benutzernamen verknüpfen musst.
Der zweite deiner beiden Wege ist aber der bessere, wobei ich bisher die Tabelle phpbb_topics_posted noch nie verwendet habe. Die Informationen sind im Prinzip auch redundant, weil sie in der Tabelle phpbb_posts auch drin sind. Möglicherweise hat die Speicherung auf die Weise aber bei großen Foren Vorteile, weil ja ein User in einem Thema auch mehrfach schreiben kann. Wenn sie das enthält was ich vermute, dann brauchst du neben dieser Tabelle noch eine weitere Tabelle um an deine Infos zu gelangen: Die Tabelle phpbb_users enthält den Usernamen. Apropos redundante Infos: Die topic_id brauchst du sicher nicht noch mal abfragen, die ist bei allen Ergebnissen gleich, wenn du sie in der
WHERE
Bedingung auf 17 festnagelst.
Mehrere Tabellen kann man auch in einer Abfrage abfragen. Am besten machst du das mit einem
LEFT JOIN
. Es gibt eine ganze Reihe anderer joins, aber in meinen Augen ist
LEFT JOIN
der wichtigste davon den man am häufigsten braucht. Ein LEFT JOIN stellt alle Datensätze der Haupttabelle da und sucht einen passenden Datensatz in der zusätzlichen Tabelle. Welchen, kannst du mit der
ON
Bedingung angeben. Wird keiner gefunden, sind die zusätzlich abgefragten Felder NULL. In vielen Fällen hat man eine 1:1 Beziehung oder eine N:1 Beziehung und kann z.B. auf diese Weise den Thementitel gemeinsam mit den Beiträgen, den Autorennamen gemeinsam mit den Beiträgen oder ähnliche Dinge abfragen. Die Hauptabfrage sind in beiden Fällen die Beiträge, aber zu jedem Beitrag gehört genau ein Thementitel bzw. ein Autor als "Nebeninformation".
Code: Alles auswählen
SELECT t.felder, j.felder
FROM tabelle t
LEFT JOIN tabelle2 j ON t.id = j.id
WHERE bedingung
ORDER BY sortierung ASC
Die Bezeichnungen t und j sind jeweils ein Alias für die beiden Tabellen um nicht so viel schreiben zu müssen. Bei den Feldern im SELECT Teil müssen sie angegeben werden, wenn nicht eindeutig klar ist, aus welcher der beiden Tabellen die Info stammen soll (die user_id oder topic_id gibt es z.B. in mehreren Tabellen).