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.
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.
Ik ben tot nog toe tot het volgende SQL statement gekomen:
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!
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!