Scheitere an Query mit spezieller Sortierung

Hallo!

Ich habe Datensätze, die jeweils einen Post innerhalb eines Forums (besser: innerhalb eines Threads) anzeigen. Jeder Post bekommt fortlaufend eine ID (postID) und hat eine parentID, welche anzeigt, ob dieser Post eine Antwort auf einen anderen Post ist. Ist die parentID = 0, dann ist der Post der erste in dem Thread (diese Art von Post stellt den Threadanfang dar).

Post

postID
parentID
userID
postingDate
title

Ich möchte nun folgendes:
Alle Posts eine Nutzers ausgeben, allerdings so, dass sie nach gleichem Thread sortiert sind.

So soll es bsp. sortiert sein:

GesuchterUser’s first Thread A order by parentID, postingDatum

Das Problem dabei ist natürlich, dass somit alle Postings, welche den Thread einleiten am Anfang stehen und dann erst sortiert die Postings kommen, welche eine Antwort darstellen.

Ich hoffe, mein Problem kam einigermaßen rüber …

morgen!

meiner meinung nach, wäre es wichtiger, die threads logisch mit einer id zusammenzuhalten - also threadID statt parentID

Ist die parentID = 0, dann ist der Post der erste in
dem Thread (diese Art von Post stellt den Threadanfang dar).

select top 1 * from … where … order by postingDatum

Alle Posts eine Nutzers ausgeben, allerdings so, dass sie nach
gleichem Thread sortiert sind.

dass würde dann mit

select title from Post where userID = order
by threadID, postingDatum

funktionieren… oder nicht?

morgen!

meiner meinung nach, wäre es wichtiger, die threads logisch
mit einer id zusammenzuhalten - also threadID statt parentID

Da hast Du mit Sicherheit Recht, allerdings kann/darf ich das DB-Schema nicht ändern …

mit den vorhandenen spalten fürchte ich funkts nicht. dir fehlt da ganz einfach eine information über die threads (außer du lasst dir irgendeinen albernen schnickschnack wie einen nicht änderbaren titel einfallen um damit die threads zusammenzuführen…)

allerdings kann/darf ich das DB-Schema nicht ändern …

komm schon, eine kleine spalte hat noch noch niemandem geschadet… :smile:

Ich habe Datensätze, die jeweils einen Post innerhalb eines
Forums (besser: innerhalb eines Threads) anzeigen. Jeder Post
bekommt fortlaufend eine ID (postID) und hat eine parentID,
welche anzeigt, ob dieser Post eine Antwort auf einen anderen
Post ist. Ist die parentID = 0, dann ist der Post der erste in
dem Thread (diese Art von Post stellt den Threadanfang dar).

dieses schema bedeutet, dass du nie mit einem einzelnen select
herausbekommen kannst, welches das root-posting ist.
das bedeutet, du musst rekursiv in der datenbank arbeiten.
das ist nicht nur bei diesem problem hinderlich, sondern auch
bei ganz vielen anderen.
du brauchst eine thread-id, anders ist das nicht vernünftig zu lösen.
als billig-lösung, für die du auch keine extra thread-tabelle brauchst,
könntest du jedem posting eine thread-id geben, die zugleich die
„root“ posting-id des threads ist. das ist einfach zu implementieren
und zu deployen.

Hi Serethos,

in Oracle SQL müsste das mit CONNECT BY/PRIOR/SIBLINGS gehen. Habe aber leider gerade keine Oracle Datenbank zur Hand, und habe das auch noch nie verwendet.

Bei anderen SQL Dialekten fällt mir dazu nur ein, eine temporäre Tabelle zu generieren, in der die ID des jeweiligen Start-Artikels jedes Threads eingetragen wird.

… Michael

Moin, serethos,

unter der Voraussetzung, dass die PostIds aufsteigend vergeben werden, hätte ich eine ziemlich hinterfotzige Lösung anzubieten, bin aber nicht sicher, ob sie Deine Anforderung abdeckt:

select post, parent, username, posted, title from posts
where parent 0
union
select parent, post, username, posted, title from posts
where parent=0
order by 2,1;

Der erste Teil holt die Posts ohne die Startposts, der zweite besorgt die Startposts, allerdings mit den Columns post und parent vertauscht und per UNION „drangelogen“. Das Ergenbis:

post parent username posted title

 0 1 'me' '2007-07-23' 'a'
 2 1 'me' '2007-07-23' 'a1'
 3 1 'me' '2007-07-23' 'a2'
 0 4 'me' '2007-07-23' 'b'
 5 4 'me' '2007-07-23' 'b1'
 6 4 'me' '2007-07-23' 'b2'
 0 7 'me' '2007-07-23' 'c'
 8 7 'me' '2007-07-23' 'c1'
 9 7 'me' '2007-07-23' 'c2'
 10 7 'me' '2007-07-23' 'c3'
 11 7 'me' '2007-07-23' 'c4'
 12 7 'me' '2007-07-23' 'c5'

Aus der Frage sehe ich nicht so recht, ob auch Antworten auf Antworten gegeben werden; das kann diese Lösung jedenfalls nicht abbilden.

Gruß Ralf

Nachtrag
So sieht die Tabelle erstmal aus:

post parent username posted title

 1 0 'me' '2007-07-23' 'a'
 4 0 'me' '2007-07-23' 'b'
 7 0 'me' '2007-07-23' 'c'
 2 1 'me' '2007-07-23' 'a1'
 3 1 'me' '2007-07-23' 'a2'
 5 4 'me' '2007-07-23' 'b1'
 6 4 'me' '2007-07-23' 'b2'
 8 7 'me' '2007-07-23' 'c1'
 9 7 'me' '2007-07-23' 'c2'
 10 7 'me' '2007-07-23' 'c3'
 11 7 'me' '2007-07-23' 'c4'
 12 7 'me' '2007-07-23' 'c5'

Gruß Ralf

Hallo,
unter MS SQL kann ich z. B. solche Auswertung einstellen:

Select Titel, ThreadID,CASE ParentID when 0 then 1 else 2 END as ErstesSortierKriterium, ParentID from Post where UserID=@GesuchterUser
Order By ThreadID, CASE ParentID when 0 then 1 else 2 END, PostingDatum

Gruß EPA

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]