[SQL] Probleem met generen gesprekkenoverzicht voor "forum"

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Jo3p789
  • Registratie: April 2006
  • Laatst online: 19-08-2024
Hoi,

De afgelopen dagen heb ik mijn tanden stuk lopen bijten in een SQL statement om conversaties weer te geven die in een forum zijn gestart. Dat is an sich niet zo moeilijk, maar het gaat mis wanneer ik probeer de informatie over de laatste post en het aantal posts in de tabel te integreren.

Ik maak gebruik van een tabel POST, waar zowel de startpost als de opvolgende posts zitten.

code:
1
2
3
4
5
6
7
POST
post_id
parent_post_id
primal_ancestor_id
created_by_user_id
created_on
...


in primal_ancestor_id wordt de oudste voorvader opgeslagen. Op die manier is het eenvoudig om alle reacties op een post te verzamelen. parent_post_id is simpelweg het id van de post waarop is gereageerd. Er is nog een aantal andere velden, maar die zijn voor mijn probleem niet relevant.

code:
1
2
3
4
USER
user_id
username
...


Ik ben tot nog toe tot het volgende SQL statement gekomen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
SELECT
   Conversation.post_id AS conversation_id,
   UserCreatedBy.username AS created_by_username,
   Count(CommentCount.post_id) AS comment_count,
   CommentLast.post_id AS last_comment_id,
   Max(CommentLast.created_on) AS last_comment_created_on,
   UserLastComment.username AS last_comment_created_by_username,
   Conversation.created_on

FROM Post AS CommentCount RIGHT JOIN (
   [User] AS UserLastComment RIGHT JOIN (
      Post AS CommentLast RIGHT JOIN (
         [User] AS UserCreatedBy INNER JOIN Post AS Conversation ON UserCreatedBy.user_id = Conversation.created_by
      )
      ON CommentLast.primal_ancestor_post_id = Conversation.post_id
   )
   ON UserLastComment.user_id = CommentLast.created_by
)
ON CommentCount.primal_ancestor_post_id = Conversation.post_id

GROUP BY
   Conversation.post_id,
   UserCreatedBy.username,
   CommentLast.post_id,
   UserLastComment.username,
   Conversation.parent_post_id,
   Conversation.created_on

HAVING (
   Conversation.linkedpaper_id=@linkedpaper_id
   AND Conversation.parent_post_id Is Null

ORDER BY Max(CommentLast.created_on) DESC, Conversation.created_on DESC


In regel 30 worden alleen de conversaties geselecteerd die horen bij een bepaald onderwerp. Ik heb deze link verder weggelaten, omdat deze mijns inziens ook niet tot het probleem behoort.

Het gaat hiermee bijna goed, alleen worden de conversaties nu net zo vaak weergegeven als dat er comments zijn geplaatst. Het lijkt of de verschillende joins niet helemaal gescheiden zijn, en invloed op elkaar uitoefenen, maar ik kom er maar niet achter waarom dit gebeurt.

Ik weet dat het nogal een statement geworden is, maar ik hoop dat iemand in een oogopslag ziet waar ik struikel, want op dit moment zit ik helemaal vast.

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Je hebt nu een right join genaamd CommentLast. Deze genereerd voor ieder comment een rij. Aangezien je niet groepeerd per conversatie (je wilt toch maar 1 CommentLast?), maar daarentegen gewoon ieder commentLast selecteerd)

Om het te repareren zul je waarschijnlijk een subquery willen gebruiken die alleen het laatste comment van een conversatie ophaald.

petersmit.eu