Jeśli użyjemy takiego joina to właściwie cały ten IF możemy zastąpić SELECT 1 AS isFavs, zapewnia to sam warunek złączenia, a nie przypuszczam by o to autorowi chodziło.
W ogóle ciężko stwierdzić o co chodziło, bo jesteśmy przygniecieni ogromem informacji zawartych w stwierdzeniu "ale to nie dział".
Prawidłową odpowiedzią na najbardziej prawdopodobny scenariusz czyli autorowi chodziło o to, by wyświetlić wszystkie posty oraz informację czy dany post znajduje się w czyichkolwiek ulubionych byłoby poprawienie oczywistego błędu składniowego - zamiana fav_id na post_id, bo pola fav_id nie ma w strukturze tabel. Obawiam się jednak, że nadal możemy otrzymać odpowiedź "wciąż nie dział".
Jeśli jednak o to właśnie chodzi, a mamy użyć do tego joina, zamiast całkiem wolnego IN( ), to lepiej byłoby:
SELECT DISTINCT posts.* , ulubione.post_id IS NOT NULL AS isFavs
FROM posts LEFT JOIN ulubione ON posts.id = ulubione.post_id