В сети много об этом написано, есть на хабре, ссылок дать не могу, но есть, то есть предлагаются различные способы решения.
Я согрешил, мельком глянул, а в цикле не запрос, а подготовка. Чем объединять кучу запросов, уж тогда получить запросом все уникальные ключ таблицы, тем более, что постраничный вывод опирается на общее количество записей, перемешать их, запомнить, из этого массива брать срезы равные ширине навигатора, и выбирать
"SELECT * table WHERE field IN(" . implode(",", keys) . ")"
одним запросом.
Иначе с range что-то будет выбираться не единожды, а что-то может и вообще не показано.
Если нужно что-то собрать, то необязательно "по частям", это можно записать и разом:
$str = implode('separator or none', function() {
return .....
}, $array)