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.