Sortieren nach fremden Tab-Feld

murdi

Erfahrenes Mitglied
Guten Abend,

folgende Frage hätte ich bezüglich Sortieren nach fremden Tab-Feld.

Kurz zur Umgebung: Programmiert werden soll ein einfaches Forum.
Es gibt eine Tabelle Theards und eine Tabelle Beitraege. Datensaetze aus der Tabelle Beitraege werden den Theards über einen Fremdschlüssel zugewiesen.

Zielstellung: Darstellung der Theards, welche nach dem letzten Beitrag chronologisch geordnet werden soll.

Ich hatte vor, dass ganze einfach und schnell über eine LEFT-JOIN-Verbindung zu realisieren (Zielstellung ist natürlich auch Theards anzuzeigen, die noch keine Antwort enthalten). Doch scheinbar funktioniert es doch nicht so einfach. Wonach sortiert wird kann ich gar nicht genau sagen, nach meinem Kriterium jeden falls nicht.

ABFRAGE:

PHP:
SELECT * FROM TabForumTheard LEFT JOIN TabForumBeitraege ON  TabForumTheard.ForumTheardID = TabForumBeitraege.REFForumTheardID WHERE REFForumRubriken = 'ForumRubID' GROUP BY TabForumTheard.ForumTheardID ORDER BY TabForumTheard.ForumTheardADDTime DESC

Möglicherweise ist es mittlerweile einfach zu spät um den Fehler zu entdecken!

Über Hilfe würde ich mich sehr freuen.

Gruß murdi
 
Als Sortierspalte wird von dir eine Spalte aus der Tabelle der Threads angegeben - Sollte es nicht eine Spalte aus der Tabelle der Beiträge sein?
Die Technik macht, dumm gesagt, nur das, was du ihr vorgibst. Wenn da steht, die selektierten Datensätze sollen nach dieser Spalte sortiert werden, dann tut das die DB-Software auch ;)
Weitere Kritik, die jedoch eher Geschmackssache ist, bilden die Bezeichnungen - Erinnert mich irgendwie an die von den ersten Versionen von "Wordpress" angelegten Tabellen. Hier und da ein Underscore, und hier und da auch ein paar Aliase via AS halten die Sache schön übersichtlich.

SQL:
SELECT
    *
FROM
    `TabForumTheard`
LEFT JOIN
    `TabForumBeitraege` ON
    `TabForumTheard`.`ForumTheardID` = `TabForumBeitraege`.`REFForumTheardID`
WHERE
    `REFForumRubriken` = 'ForumRubID'
GROUP BY
    `TabForumTheard`.`ForumTheardID`
ORDER BY
    `TabForumBeitraege`.`ADDTime` DESC
Abstrahiert also
SQL:
SELECT
    *
FROM
    `forum_thread` AS `t`
LEFT JOIN
    `forum_post` AS `p` ON
    `p`.`thread_id` = `t`.`thread_id`
GROUP BY
    `t`.`thread_id`
ORDER BY
    `p`.`lastpost` DESC
 
Guten Morgen,

danke maeTimmae für deine Vorschläge. Du hast recht, mein Sortierfeld war falsch.Natürlich muss ich nach der ADDTime in der Tabelle Beitraege sortieren lassen. Dies habe ich jedoch auch gestern schon gemacht, leider ohne den gewünschten Erfolg.

Was mir nun aufgefallen ist... Durch die Anweisung GROUP BY wid immer nach dem ersten, aber nicht aktuellsten Beitrag sortiert. Mir scheint, als benötigte ich noch eine Unterabfrage um meine durch GROUB BY zusammengefassten Felder zu sortieren.

Hier noch einmal die angepasste Abfrage:

PHP:
   SELECT * FROM
   	TabForumTheard AS tabT
   LEFT JOIN
   	TabForumBeitraege AS tabB
   ON
   	tabT.ForumTheardID = tabB.REFForumTheardID
   WHERE
   	tabT.REFForumRubriken = 'ForumRubID'
   ORDER BY
   	tabB.ForumBeitraegeADDTime DESC
 
Zuletzt bearbeitet:
Wenn du das GROUP BY drin lässt, sollte dir die SQL-Funktion MAX weiterhelfen:
SQL:
ORDER BY MAX(`tabB`.`ForumBeitraegeADDTime`) DESC
Habe das nicht durchgespielt, sollte aber hinkommen.
 
Hallo,

ich danke dir für den sehr nützlichen Tipp! Nun werden wenigstens die Theards richtig sortiert, die bereits ein Beitrag bzw Antwort haben. Nun stehen aber auch noch Theards in der Tabelle die keine Antwort bzw Beitrag haben. Diese werden nun ganz am Ende sortiert dargestellt.

Also hat sich das Problem leider noch nicht ganz gelöst. Es müssten sozusagen 2 Felder aus 2 verschiedenen Tabellen gleichwertig sortiert werden.

Ich werds mal probieren!

Schöne Mittagspause !
 
Leichter und performanter wäre für deine Zwecke natürlich die - auch wenn es nicht ganz im Sinne der Vererbung von Schlüsselwerten ist - Speicherung des last reply Zeitwerts in der Thread-Tabelle.
Alternativ ließe sich eventuell etwas mit einer Umschreibung des Queries bezwecken (ungetestet):
SQL:
SELECT
    `spalte1`,
    `spalte2`,
    `...`,
    ( CASE ISNULL(MAX(`tabB`.`ForumBeitraegeADDTime`))
        THEN `tabT`.`ForumTheardADDTime`
        ELSE MAX(`tabB`.`ForumBeitraegeADDTime`)
      END ) AS `lastreply`
FROM
    `TabForumTheard` AS `tabT`
LEFT JOIN
    `TabForumBeitraege` AS `tabB` ON
    `tabT`.`ForumTheardID` = `tabB`.`REFForumTheardID`
WHERE
    `tabT`.`REFForumRubriken` = 'ForumRubID'
GROUP BY
    `TabForumTheard`.`ForumTheardID`
ORDER BY
    `lastreply` DESC

In wiefern das jetzt noch umgemodelt werden muss, kann ich dir leider nicht sagen - Bin in letzer Zeit leider eher seltener mit interessanten Datenbankoperationen in Berührung gekommen.
 
Hallo,

wollte mich noch schnell für deine Hilfe bedanken.
Habe es jetzt ganz ähnlich deinem letzten Vorschlag gemacht. Solabd ein neuer Eintrag getätigt wird, lasse ich das Datum und die ID des Autors mit in den Datensatz des Theards schreiben bzw. updaten.

Vielleicht nicht mehr ganz so sauber... aber funktioniert ;)

In diesem Sinne, danke !

Gruß murdi
 
Zurück