Comme mluebke
commenté, utiliser GROUP signifie que vous n'en obtenez qu'un un résultat pour chaque catégorie. D'après la liste que vous avez donnée en exemple, je pense que vous voulez quelque chose comme ceci :
$sql = "SELECT * FROM products WHERE category IN (10,120,150,500) GROUP BY category ORDER BY category, id";
$res = mysql_query($sql);
$list = array();
while ($r = mysql_fetch_object($res)) {
$list[$r->category][$r->id]['name'] = $r->name;
$list[$r->category][$r->id]['whatever'] = $r->whatever;
// etc
}
Et puis bouclez dans le tableau. Exemple :
foreach ($list as $category => $products) {
echo '<h1>' . $category . '</h1>';
foreach ($products as $productId => $productInfo) {
echo 'Product ' . $productId . ': ' . $productInfo['name'];
// etc
}
}