Запросы к БД в цикле — точно не то, что нужно.
Вообще, лучший вариант — отсортировать выборку по первому полю, и обходить ее, попутно выводя как-то так:
$arr = array(
array(1, 11),
array(1, 12),
array(1, 13),
array(2, 21),
array(2, 22));
$last_key = -1;
foreach ($arr as $a) {
if ($a[0] !== $last_key) {
echo '<br>'.$a[0].': '.$a[1];
$last_key = $a[0];
} else {
echo ', '.$a[1];
}
}
Если же по каким-то причинам нельзя отсортировать выборку на уровне СУБД, можно либо отсортировать ее на уровне PHP (наверное, придется прибегнуть к usort()), либо воспользоваться array_reduce():
$arr = array(
array(1, 11),
array(1, 12),
array(1, 13),
array(2, 21),
array(2, 22));
function f($o, $i)
{
$o[$i[0]][] = $i[1];
return $o;
}
print_r(array_reduce($arr, 'f'));
На выходе будет массив такого вида:
Array
(
[1] => Array
(
[0] => 11
[1] => 12
[2] => 13
)
[2] => Array
(
[0] => 21
[1] => 22
)
)
Думаю, вывести его в нужном виде не проблема. Но это уже подход, что называется, на любителя.