Запрос должен быть примерно таким:
SELECT LEFT(`name`, 1) `abc`, `id`, `name` FROM `persons` ORDER BY `name` ASC;
На выходе вы получите такой массив:
$data = [
['abc' => 'а', 'id' => 1, 'name' => 'Абрамов Михаил Фёдорович'],
['abc' => 'а', 'id' => 2, 'name' => 'Агутин Юрий Николаевич'],
['abc' => 'б', 'id' => 4, 'name' => 'Баринов Олег Юрьевич'],
];
Далее проходим по всему массиву и складываем по начальным буквам:
$alphabet = [];
foreach ($data as $row){
$alphabet[$row['abc']][$row['id']] = $row['name'];
}
Получается что-то подобное:
$alphabet = [
'а' => [
1 => 'Абрамов Михаил Фёдорович',
2 => 'Агутин Юрий Николаевич',
],
'б' => [
4 => 'Баринов Олег Юрьевич',
],
];
Дальше, я думаю, вы уже сами догадались:
foreach($alphabet as $alpha => $rows){
echo '<h2>'.$alpha.'</h2>';
echo '<ul>';
foreach ($rows as $id => $name){
echo '<li><a href="/person?id='.$id.'">'.$name.'</a></li>';
}
echo '</ul>';
}