Przerobienie kwerendy dla wielu rekordów w sql

0

Cześć
Chciałem się spytać o przerobienie danej kwerendy tak, aby można nią było wykonywać zapytania dla wielu rekordów.
Są 2 tablice:

posts -> id, text, parent_id, level, path, created_at
comments -> id, text, post_id, created_at

Zasadniczo pola id, created_at i text są jasne. Natomiast w postach pole parent_id wskazuje na rekord z tej samej tablicy posts, w taki sposób, że dany post może mieć jednego rodzica i może mieć również wiele dzieci. W ten sposób posty tworzą drzewo. Pomocnicze kolumny to level, który oznacza jak głęboko w drzewie znajduje się post (0 dla postu bez rodzica, 1 dla dziecka bezpośredniego, 2 dla dziecka dziecka itd...), a path to połączone ze sobą slashem '/' kolejne id rodziców od korzenia do danego postu.
Każdy post ma również wiele komentarzy. Aby wyciągnąć z bazy danych komentarze dla danego postu/postów po id można użyć takiej kwerendy:

select * from comments inner join posts on comments.post_id = posts.id where posts.id in (?, ?, ...)
-- ? to id danego komentarza

Jednak nie każdy post ma "bezpośrednie" komentarze. A co gdy chcemy wyciągnąć tylko ostatni komentarz dla danego postu?
W takiej sytuacji należałoby wyciągnąć z bazy ostatni komentarz spośród potomków. Dla jednego postu można zrobić to mniej więcej tak:

select * from comments inner join posts on comments.post_id = posts.id where posts.path like ? order by posts.level limit 1
-- ? to ścieżka postu, dla którego szukamy ostatniego komentarza i % na końcu
-- przykładowo 1/%
-- order by jest natomiast po to, aby bezpośrednie komentarze były zwrócone wcześniej

W jaki sposób wykonać taką kwerendę dla wielu postów? Powinna ona zwracać * z komentarzy i jeszcze gdzieś id oryginalnego postu, dla którego szukany jest ostatni komentarz.

0

Wywal z ostatniego zapytania warunek na path i dostaniesz zapytanie zwracające wszystkie komentarze do wszystkich postów.

0
SELECT c.Id, 
(select top 1 p.text  from posts p where c.post_id = p.id order by Level desc )  as Text
(select top 1 p.Id from posts p where c.post_id = p.id order by Level desc )  as PostId
FROM comments c
 

Nie wiem, moim zdaniem coś w ten deseń powinno zadziałać

1 użytkowników online, w tym zalogowanych: 0, gości: 1