I am trying to write a SQL query where I can query the latest and previous/last two comments. I have table structures as below -
Record Table
Id | RecordName | LatestCommentId |
---|---|---|
1 | Record 1 | 3 |
2 | Record 2 | 6 |
3 | Record 3 | 7 |
Comment Table
Id | Comment | PreviousCommentId |
---|---|---|
1 | Comment 1 | NULL |
2 | Comment 2 | 1 |
3 | Comment 3 | 2 |
4 | Comment A | NULL |
5 | Comment B | 4 |
6 | Comment C | 5 |
7 | Comment P | NULL |
Record table references Comments table to get the latest comment id for that record. I want to create a query where I get the latest as well as previous comments like -
RecordName | LatestComment | PreviousComment | PreviousComment1 |
---|---|---|---|
Record 1 | Comment 3 | Comment 2 | Comment 1 |
Record 2 | Comment C | Comment B | Comment A |
Record 3 | Comment P | NULL | NULL |
I will be storing only last two comments along with latest comment.
I was also exploring the Recursive CTE option and here is what I was able to create -
WITH COMMENTS_HISTORY AS (
SELECT
Id,
CommentBody,
PreviousCommentId
FROM
Comment
WHERE
PreviousCommentId IS NULL
UNION ALL
SELECT
c.Id,
c.CommentBody,
c.PreviousCommentId
FROM
Comment c, COMMENTS_HISTORY ch
WHERE c.PreviousCommentId = ch.Id
)
SELECT
c.Id,
c.CommentBody AS 'Latest Comment',
ch.CommentBody AS 'Comment 1'
FROM
COMMENTS_HISTORY ch
LEFT JOIN
Comment c
ON
ch.PreviousCommentId = c.Id
CodePudding user response:
You just need to join the comment
table 3 times, one per comment column
SELECT
r.recordname,
c.comment AS LatestComment,
pc.comment AS PreviousComment,
pc1.comment AS PreviousComment1
FROM record r
LEFT JOIN comment c ON c.id = r.latestcommentid
LEFT JOIN comment pc ON pc.id = c.previouscommentid
LEFT JOIN comment pc1 ON pc1.id = pc.previouscommentid
Output
recordname | LatestComment | PreviousComment | PreviousComment1 |
---|---|---|---|
Record 1 | Comment 3 | Comment 2 | Comment 1 |
Record 2 | Comment C | Comment B | Comment A |
Record 3 | Comment P | null | null |
db<>fiddle here