Ключ к вашей проблеме в том, что product_id просто не работает ни с группировкой, ни с агрегатной функцией (этот запрос не будет выполняться в большинстве RDMS).
(SELECT order_id, product_id, min(average_price) as average_price
FROM orders
GROUP BY order_id
) as min_priced_product_per_order
Это отличное расширение, созданное MySQL, чтобы избежать определенных объединений, требующих подзапросов, которые в прошлом он не поддерживал. product_id выбирается произвольно, т. е. в какой бы строке он ни находился первым без особой причины. Это, безусловно, не будет (ну может случайно) вернуть результаты, которые вы хотели бы, если вы ищете определенный product_id. http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html
Вы всегда можете написать такие запросы, отбросив идентификатор-нарушитель (product_id) из агрегата во внутреннем запросе, а затем присоединиться к вашему значению агрегата в этом случае min (average_price) во внешнем запросе, чтобы найти идентификатор.
(SELECT min_order.order_id, product_id, min_order.average_price
FROM
(SELECT order_id, min(average_price) as average_price
FROM orders
GROUP BY order_id
) AS min_order
JOIN orders on
min_order.product_id = order.product_id
AND min_order.average_price = order.average_price
Примечание: это вернет все минимальные средние_продукты_идентификатора продукта, если есть связь. Что для меня кажется правильным, иначе вы просто выбираете один продукт произвольно, а это не то, чем должен быть SQL. Но вы можете снова отфильтровать результаты, обернув другой агрегат вокруг вышеуказанного запроса, а затем выбрать минимальный или максимальный идентификатор продукта, чтобы убедиться, что вы получите только один результат на заказ.