вообще, джойны дублируют строки в ответе, когда со стороны зависимой таблицы отношение *-ко-многим, что ломает работу limit/offset. но это решаемо вторым запросом с where … in.
проблема тут в том что в контексте первого запроса может не быть информации о том, какие связанные записи понадобятся в последствии. код, обрабатывающий полученные записи по одной, обращается к зависимостям, не зная что кроме текущей записи есть ещё N точно таких же и по ним нужно выбирать точно те же зависимости… вот тут и возникает N+1